#! /usr/bin/env python3
# -*- coding:utf-8 -*-

from perm.models import UserModel, UserRoleRelationModel, UserLspRelationModel, RoleModel
from django.db.models import Q
from utils.base import BaseQuery


class UserDao(BaseQuery):
    """
    用户数据
    """

    def __init__(self):
        self.user_model = UserModel
        self.user_role_model = UserRoleRelationModel
        self.user_lsp_relation_model = UserLspRelationModel
        self.select_values_list = ["id", "name", "real_name", "is_admin", "phone", "email", "status", "create_time"]

    def search(self, wd, page, page_size=20, status=None):
        """
        匹配姓名或账号;
        :param status:
        :param str wd: 查询关键字
        :param int page: 当前页码
        :param int page_size: 每页条数，默认20
        :return tuple: 总条数，总页数，用户信息列表
        """
        if not wd:
            return []

        q = Q()
        q.connector = "OR"
        q.children.append(("name__startswith", wd))
        q.children.append(("real_name__startswith", wd))
        query_set = self.user_model.objects.values(*self.select_values_list).filter(q)
        if status is not None:
            query_set = query_set.filter(status=status)
        count, total_page, user_list = self.query_list(query_set, page, page_size)
        return count, total_page, user_list

    def read_by_name(self, name):
        """
        通过用户名查询; 如果有重名取最后一个
        :param str name: 账户名
        :return dict: {user_info}
        """
        if not name:
            return {}

        user_info = self.user_model.objects.filter(name=name).order_by("-id").first()
        if not user_info:
            return {}

        return self.to_dict(user_info)

    def read_user_by_id(self, uid):
        """
        通过id查询
        :param int uid: 用户id
        :return dict:
        """
        if not uid:
            return {}

        user_info = self.user_model.objects.filter(pk=uid).first()
        return self.to_dict(user_info)

    def read_list(self, page, page_size, status=None):
        """
        列表
        :param int page: 页码
        :param int page_size: 每页条数
        :param int status: 状态
        :return tuple: count:总数, user_list
        """
        if status is not None:
            query = self.user_model.objects.values(*self.select_values_list).filter(status=status)
        else:
            query = self.user_model.objects.values(*self.select_values_list).all()

        count, total_page, user_list = self.query_list(query, page, page_size)
        return count, total_page, user_list

    def insert(self, user_info):
        """
        插入数据
        :param dict user_info: {
                                    "name": 名字,
                                    "status": 状态,
                                    "is_admin": 是否是admin,
                                    "password": 密码,
                                    "phone": 手机号,
                                    "email": 邮箱,
                                }
        :return:
        """
        user = self.user_model(**user_info)
        user.save()
        return user

    def update(self, update_info, uid):
        """
        编辑;
        在上层判断uid是否存在
        :param dict update_info: {
                "name": name,
                "status": int(status),
                "is_admin": int(is_admin),
                "phone": phone,
                "email": email,
            }
        :param int uid: 待修改的用户的id
        :return:
        """
        self.user_model.objects.filter(pk=uid).update(**update_info)

    def insert_relation(self, uid, role_id_list):
        """
        插入用户和角色对应关系
        :param int uid: 用户id
        :param list role_id_list: 角色id列表
        :return:
        """
        if not role_id_list:
            return

        obj_list = []
        for role_id in role_id_list:
            obj_list.append(self.user_role_model(
                user_id=uid, role_id=role_id
            ))

        self.user_role_model.objects.bulk_create(obj_list)

    def insert_lsp_relation(self, uid, lsp_ids):
        if not lsp_ids:
            return
        lsp_ids = lsp_ids.split(",")
        obj_list = []
        for lsp_id in lsp_ids:
            obj_list.append(self.user_lsp_relation_model(
                user_id=uid, lsp_id=lsp_id
            ))

        self.user_lsp_relation_model.objects.bulk_create(obj_list)

    def delete_relation(self, uid):
        """
        删除用户和角色对应关系
        :param int uid: 用户id
        :return:
        """
        self.user_role_model.objects.filter(user_id=uid).delete()

    def delete_lsp_relation(self, uid):
        """
        删除用户和角色对应关系
        :param int uid: 用户id
        :return:
        """
        self.user_lsp_relation_model.objects.filter(user_id=uid).delete()

    def read_relation_by_uid(self, uid):
        """

        :param int uid: 用户ID
        :return list:
        """
        relation_list = self.user_role_model.objects.filter(user_id=uid).all()
        return self.to_list(relation_list)

    def read_lsp_relation_by_uid(self, uid):
        """

        :param int uid: 用户ID
        :return list:
        """
        relation_list = self.user_lsp_relation_model.objects.filter(user_id=uid).values('lsp_id', 'lsp_id__name')
        return self.to_list(relation_list)

    def read_yunwei_role(self, uid):
        # 默认值 运维
        queryset = RoleModel.objects.filter(pk=15)
        return self.to_list(queryset)
