'''
Author: your name
Date: 2021-07-27 16:19:06
LastEditTime: 2021-07-28 09:28:49
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\menu.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-

from pprint import pprint
from datetime import datetime
from application.app import db
from models.user import UserModel
from models.menu import MenuModel
from webcreator.log import logger
from webcreator.response import ResponseCode

count = 0

class MenuResource(object):
    def __init__(self):
        super().__init__()

    def print_tree(self, group_name, tab=1):
        """
        :param str group_name:要查找的树的根的名称
        :param int tab: 格式化用的-数量
        """
        group = db.session.query(MenuModel).filter_by(name=group_name).one_or_none()
        if not group:
            return
        # group found - print name and find children
        print('- ' * tab + group.name)
        global count
        count = count + 1
        for child_group in group.children:  # type: TreeGroup
            # new tabulation value for child record
            self.print_tree(child_group.name, tab * 2)

    def batch(self, params={}, jwt={}):
        # 如果id里面包含无法转换为数字的字符,那么该接口将会报错
        ids = list(map(lambda x:int(x), params.get("ids").split(",")))

        result = db.session.query(MenuModel).filter(MenuModel.id in ids).delete()
        db.session.commit() # 这是批量删除模式
        logger.info(result)
        return True, ResponseCode.HTTP_SUCCESS

    def updateSort(self, params={}, jwt={}):
        user = db.session.query(UserModel).filter(UserModel.uuid==jwt.get("uuid")).one_or_none()
        if not user:
            return False, ResponseCode.USER_NOT_EXISTS
        
        # 接口字段可能和数据库字段不一致
        result = db.session.query(MenuModel).filter(MenuModel.id==params.get("id")).one_or_none()
        if result:
            sort = 1
            if params.get("direction") == "bottom":
                sort = -1
            result.update_at = datetime.now()
            result.update_by = user.id
            result.sort = result.sort + sort
            db.session.commit()
            return True, ResponseCode.HTTP_SUCCESS
        else:
            return False, ResponseCode.HTTP_NOT_FOUND

    def create(self, params={}, jwt={}):
        user = db.session.query(UserModel, UserModel.id).filter(UserModel.uuid==jwt.get("uuid")).one_or_none()
        if not user:
            return False, ResponseCode.USER_NOT_EXISTS
        # 接口字段可能和数据库字段不一致
        extends = MenuModel.fields_mapping()
        data = dict(is_delete=False, sort=0, remarks="")
        data.update({
            'create_by': user.id,
            'create_at': datetime.now(),
            'update_by': user.id,
            'update_at': datetime.now(),
        })
        for k in params.keys():
            if k in extends:
                k[extends[k]] = params[k]
                continue
            if hasattr(MenuModel, k):
                data[k] = params[k]

        if data.get("sort") == 0:
            data["sort"] = db.session.query(MenuModel).filter().count() + 1
        # 默认设置sort等于表内记录个数
        result = MenuModel(**data)
        db.session.add(result)
        db.session.commit()
        return True, ResponseCode.HTTP_SUCCESS

    def treeList(self, params={}, jwt={}):
        # self.print_tree("home")

        print("global count is ===========> ", count)

        filters = [MenuModel.is_delete==False]
        result = db.session.query(MenuModel).filter(*filters).order_by(MenuModel.sort).order_by(MenuModel.update_at.desc()).all()
        data = []
        if result:
            print(result)
            tab = 1
            for item in result:
                tmp = item.get_tree(session=db.session)
                # print(tmp, tmp.get("node"))
                for tt in tmp:
                    logger.info(tt)
                    logger.info(tt.get("node"))
                # pprint(item.get_tree(session=db.session, json=True))
                pprint(item.get_children(session=db.session))
            #     for child_group in i.children:  # type: TreeGroup
            #         # new tabulation value for child record
            #         self.print_tree(child_group.name, tab * 2)
            # for item in result:
            #     t = item.dict()
            #     data.append(t)
            # return result, ResponseCode.HTTP_SUCCESS
        return data, ResponseCode.HTTP_NOT_FOUND

    def treeNodes(self, params={}, jwt={}):
        filters = [MenuModel.is_delete==False, MenuModel.parent_id==0]
        result = db.session.query(MenuModel).filter(*filters).order_by(MenuModel.sort).order_by(MenuModel.update_at.desc()).all()
        logger.info(result)
        if result:
            return result, ResponseCode.HTTP_SUCCESS
        return None, ResponseCode.HTTP_NOT_FOUND

    def updateById(self, params={}, jwt={}):
        user = db.session.query(UserModel).filter(UserModel.uuid==jwt.get("uuid")).one_or_none()
        if not user:
            return False, ResponseCode.USER_NOT_EXISTS
        # 接口字段可能和数据库字段不一致
        extends = MenuModel.fields_mapping()
        data = dict(is_delete=False)
        data.update({
            'update_at': datetime.now(),
            'update_by': user.id
        })
        for k in params.keys():
            if k in extends:
                k[extends[k]] = params[k]
                continue
            if hasattr(MenuModel, k):
                data[k] = params[k]
        
        logger.info(data)
        # filters = [MenuModel.is_delete==False]
        # result = MenuModel.query.filter(*filters).first()
        result = MenuModel.query.filter(MenuModel.id==params.get("id")).update(data, synchronize_session=False)
        db.session.commit()
        logger.info(result)
        if result:
            return result, ResponseCode.HTTP_SUCCESS
        return None, ResponseCode.HTTP_NOT_FOUND


menuManager = MenuResource()