#! /usr/bin/env python3
# -*- coding:utf-8 -*-

"""
操作dao
"""

from perm.models import OperationModel
from utils.base import BaseQuery


class OperaDao(BaseQuery):
    def __init__(self):
        self.opera_model = OperationModel

    def read_by_id(self, opera_id):
        """
        根据id查询
        :param int opera_id: id
        :return QuerySet: QuerySet
        """
        opera_info = self.opera_model.objects.filter(pk=opera_id).first()
        return opera_info

    def read_opera_list_by_name(self, name, menu_id=0):
        """
        根据名字查找操作
        :param str name: 操作名称
        :param int menu_id: 菜单id
        :return QuerySet: QuerySet|list
        """
        query_info = {"name": name}
        if menu_id:
            query_info["menu_id"] = menu_id

        opera_list = self.opera_model.objects.filter(**query_info).all()

        return opera_list

    def read_opera_list_by_code(self, code, menu_id=0):
        """
        根据名字查找操作
        :param str code: 操作英文名称
        :param int menu_id: 菜单id
        :return QuerySet: QuerySet|list
        """
        query_info = {"code": code}
        if menu_id:
            query_info["menu_id"] = menu_id

        opera_list = self.opera_model.objects.filter(**query_info).all()

        return opera_list

    def read_opera_list(self, menu_id):
        """
        获取某菜单下的所有操作列表
        :param int menu_id: 菜单id
        :return QuerySet: QuerySet|list
        """
        opera_list = self.opera_model.objects.filter(menu_id=menu_id).all()
        return opera_list

    def read_by_id_list(self, id_list):
        """

        :param list id_list:
        :return QuerySet|list: QuerySet|list
        """
        opera_list = self.opera_model.objects.filter(pk__in=id_list).all()
        return opera_list

    def read_all(self):
        """
        获取所有
        :return list:
        """
        values_list = ["id", "name", "code"]
        opera_list = self.opera_model.objects.values(*values_list).all()
        return self.to_list(opera_list)

    def insert(self, name, code):
        """
        插入opera
        :param str name: 操作名称
        :param str code: 操作英文名称
        :return:
        """
        self.opera_model(name=name, code=code).save()

    def update(self, opera_id, name, code):
        """
        更新
        :param int opera_id: 操作id
        :param str name: 操作名称
        :param str code: 操作英文名称
        :return:
        """
        update_info = {
            "name": name,
            "code": code
        }

        self.opera_model.objects.filter(pk=opera_id).update(**update_info)

    def delete(self, opera_id):
        """
        硬删除
        :param int opera_id: 操作id
        :return:
        """
        self.opera_model.objects.filter(pk=opera_id).delete()



