#! /usr/bin/env python3
# -*- coding:utf-8 -*-

"""
菜单dao
"""

from perm.models import MenuModel
from utils.base import BaseQuery


class MenuDao(BaseQuery):
    def __init__(self):
        self.menu_model = MenuModel

    def read_menu_by_id(self, menu_id):
        """
        根据id查询
        :param int menu_id: 菜单id
        :return dict: 菜单信息
        """
        menu_info = self.menu_model.objects.filter(pk=menu_id).first()
        return self.to_dict(menu_info)

    def read_first_menu_by_name(self, name):
        """
        根据名字查询一级菜单
        :param str name: 菜单名称
        :return QuerySet: QuerySet
        """
        menu_info = self.menu_model.objects.filter(name=name, parent_id__isnull=True).first()
        return menu_info

    def read_second_menu_by_name(self, name, parent_id=0):
        """
        查询二级菜单
        :param str name: 菜单名称
        :param int parent_id: 上级菜单id
        :return QuerySet: QuerySet
        """
        query_info = {"name": name, "parent_id__isnull": False}
        if parent_id:
            query_info["parent_id"] = parent_id

        menu_info = self.menu_model.objects.filter(**query_info).first()
        return menu_info

    def read_all(self):
        """
        读取所有菜单
        :return list: list 菜单列表
        """
        menu_all_list = self.menu_model.objects.all()
        return self.to_list(menu_all_list)

    def read_by_id_list(self, id_list):
        """

        :param list id_list: id 列表
        :return QuerySet: QuerySet 菜单列表
        """
        menu_list = self.menu_model.objects.filter(id__in=id_list).all()
        return self.to_list(menu_list)

    def read_first_menu_list(self):
        """
        读取所有一级菜单列表
        :return list: |list
        """
        first_menu_list = self.menu_model.objects.filter(parent_id__isnull=True).all()
        return self.to_list(first_menu_list)

    def read_by_url(self, url):
        """
        根据url查询
        :param str url: 菜单url
        :return dict: 菜单信息
        """
        if not url:
            return {}

        menu_info = self.menu_model.objects.filter(url=url).first()
        return self.to_dict(menu_info)

    def insert(self, name, url, seq_num, ico_url, parent_id=None):
        """
        添加菜单
        :param str name: 菜单名称
        :param str url: url
        :param str ico_url: 图标url
        :param int seq_num: 排序序号
        :param int parent_id: 上级菜单ID
        :return:
        """
        info = {
            "name": name,
            "url": url,
            "seq_num": seq_num,
            "ico_url": ico_url
        }
        if parent_id:
            info["parent_id"] = parent_id

        self.menu_model(**info).save()

    def update(self, menu_id, update_info):
        """
        更新
        :param int menu_id: 菜单id
        :param dict update_info: {
                "name": 菜单名称,
                "url": url,
                "seq_num": 排序序号,
                "ico_base64": 图标base64码
                "parent_id": 上级菜单id，非必选，没有则不更新
            }
        :return:
        """
        self.menu_model.objects.filter(pk=menu_id).update(**update_info)

    def delete(self, menu_id):
        """
        硬删除
        :param int menu_id: 菜单id
        :return:
        """
        self.menu_model.objects.filter(pk=menu_id).delete()






