#! /usr/bin/env python3
# -*- coding:utf-8 -*-

from perm.models import RoleModel, RoleMenuPermModel, MenuModel
from utils.base import BaseQuery


class RoleDao(BaseQuery):
    def __init__(self):
        self.role_model = RoleModel
        self.role_perm_model = RoleMenuPermModel

    def read_by_id(self, role_id):
        """

        :param int role_id: 角色id
        :return dict: 角色信息
        """
        if not role_id:
            return {}

        role_info = self.role_model.objects.filter(pk=role_id).first()
        return self.to_dict(role_info)

    def read_last_by_name(self, name):
        """
        根据名称查询;获取最近添加的一条
        :param str name: 角色名称
        :return dict: {role_info}
        """
        if not name:
            return {}

        role_info = self.role_model.objects.filter(name=name).order_by("-id").first()
        return self.to_dict(role_info)

    def read_list(self, page, page_size):
        """
        获取列表；分页;倒序
        :param int page: 当前页码
        :param int page_size: 每页条数
        :return tuple: total_page:总页数, user_list:用户列表
        """
        query = self.role_model.objects.all()
        count, total_page, role_list = self.query_list(query, page, page_size)
        return count, total_page, role_list

    def read_by_id_list(self, id_list):
        """
        根据id列表查询
        :param list id_list: 角色id列表
        :return list: [{role_info}...]
        """
        id_list = list(set(id_list))
        role_list = self.role_model.objects.filter(pk__in=id_list).all()
        return self.to_list(role_list)

    def read_role_perm_list(self, role_id_list, menu_id_list=None):
        """
        根据角色id列表查询角色和菜单关系
        :param list role_id_list: 角色id列表
        :param list menu_id_list: 菜单id列表
        :return QuerySet|list: QuerySet|list
        """
        if not role_id_list:
            return []

        role_id_list = list(set(role_id_list))
        query_info = {"role_id__in": role_id_list}
        if menu_id_list:
            menu_id_list = list(set(menu_id_list))
            query_info["menu_id__in"] = menu_id_list

        role_perm_list = self.role_perm_model.objects.filter(**query_info).all()
        return self.to_list(role_perm_list)

    def insert(self, name, describe=""):
        """
        插入
        :param str name: 角色名称
        :param str describe: 描述
        :return:
        """
        self.role_model(name=name, describe=describe).save()

    def bulk_insert_perm(self, data_list):
        """
        批量插入
        :param list data_list: [
            {
                "role_id": 角色id,
                "menu_id": 菜单id,
                "opera_codes": 操作权限code;多个以逗号分割
            }
        ]
        :return:
        """
        obj_list = []
        for i in data_list:
            data = {
                "role": self.role_model(i["role_id"]),
                "menu": MenuModel(i["menu_id"]),
                "opera_codes": i["opera_codes"]
            }
            obj_list.append(self.role_perm_model(**data))

        self.role_perm_model.objects.bulk_create(obj_list)

    def delete(self, role_id):
        """
        硬删除
        :param int role_id: 角色id
        :return:
        """
        self.role_model.objects.filter(pk=role_id).delete()

    def update(self, role_id, name, describe=""):
        """
        编辑
        :param int role_id: 角色id
        :param str name: 角色名称
        :param str describe: 描述
        :return:
        """
        self.role_model.objects.filter(pk=role_id).update(name=name, describe=describe)

    def delete_role_perm(self, role_id):
        """
        硬删除角色菜单所有的对应关系
        :param int role_id: 角色id
        :return:
        """
        self.role_perm_model.objects.filter(role_id=role_id).delete()











