# -*- coding:utf-8 -*-
"""系统日志处理"""

from kyger.utility import json2dict, time_check, date
from kyger.utility import numeric
import json


class Log(object):
    """日志处理"""
    sql_row = 2  # 日志大于多少条才可以删除
    day = 9  # 日志时间大于多少天才能删除

    __page = 0  # 当前页
    __total_page = 0  # 总页数
    __total_rows = 0  # 总记录数

    # 日志类型
    config_type = {
        0: "所有数据类型",
        1: "查询敏感数据",
        2: "添加数据",
        3: "修改数据",
        4: "删除数据",
        5: "其他数据库操作",
        6: "后台管理员登录",
        7: "上传文件",
        8: "项目重启",
        9: "计划任务",
        10: "前台用户注册",
        11: "前台用户登录",
        12: "文件下载"
    }

    def __init__(self, db=None, kg=None):

        self.db = db  # 数据库
        self.kg = kg  # GET变量, 分页时会用到

    def list_page(self, *args, **kwargs):
        """
        分页获取日志信息，参数同list。
        :return:{
            'list':          # 分页的当前页日志数据
            'page_html':     # 分页的html模板
            'page_data':     # 分页的数据：当前页、总页数、总记录数
        }
        """
        # page和row的数据
        self.__page = numeric(self.kg['get'].get('page', 1), 1)  # 当前页
        if 'row' in kwargs: row = kwargs['row']  # 在kwargs里
        elif len(args) > 2: row = args[1]  # 在args里
        else: row = 10  # 默认10

        # 获取日志数据
        data = self.list(*args, **kwargs)
        # 分页模板合成
        web_url = self.kg['server'].get('WEB_URL')
        from kyger.common import page_tpl
        page_html = page_tpl(self.db.page, self.db.total_page, row, web_url)  # 获取分页模板
        self.__total_rows = self.db.total_rows  # 总记录数
        self.__total_page = self.db.total_page  # 总页数
        return {
            'list': data,
            'page_html': page_html,
            'page_data': {'page': self.db.page, 'total_page': self.db.total_page, 'total_rows': self.db.total_rows}
        }

    def list(self, type=0, row=10, aid=0, word='', start=0):
        """
        获取日志信息
        :param type: [int|list] 日志类型: 0所有数据/1查询敏感数据/2添加数据/3修改数据/4删除数据/5其它数据库操作/6后台管理员登录/7上传文件/8项目重启/9计划任务。缺省值0
        :param row: [int] 要获取的记录条数。缺省值10
        :param aid: [int] 要查询的管理员id，0表示所有其他为要查询的id。缺省值0
        :param word: [str] 要搜索的关键字。缺省值''
        :param start: [int] 是从第几条记录开始获取。缺省值0
        :param webid: [int] 所属的应用id，0调用全部，其他为调用webid。缺省值0
        :return: {
                    'data':                         # 数据查询到的数据
                    'branch':                       # 返回分页的html
                    'admin'                         # admin表的数据
                    'log_type'                      # 日志的类型
                    'param':                        # url参数
                    'word':                         # 搜索的关键字
                    'select':                       # 选中的用户名和日志类型
                }
        """
        # 数据查询
        if type:
            if not isinstance(type, list): type = [type]  # 判断传递过来时是否为列表，
        # sql语句
        type_sql = ','.join('%s' % v for v in type) if type else ''  # 类型
        type_sql = '&& `type` in (%s)' % type_sql if type_sql else ''
        aid_sql = '&& `adminid` =%d ' % aid if aid else ''  # 管理员id
        word_sql = '&& (`info` like "%%%s%%" or `ip` like "%%%s%%")' % (word, word) if word else ''  # 关键字搜索
        # where组合
        where = 'webid=%s %s %s %s' % (self.kg['web']['id'], type_sql, aid_sql, word_sql)
        # limit
        limit = row if self.__page else '%d, %d' % (start, row)
        # 数据查询
        log_list = self.db.list(table='log', where=where, order='`id` DESC', page=self.__page, limit=limit)
        if self.__page and self.__page > self.db.total_page:
            self.__page = self.db.total_page
            log_list = self.db.list(table='log', where=where, order='`id` DESC', page=self.__page, limit=limit)

        # 对查询到的数据进行修改
        if log_list:
            for var in log_list:
                # 数据操作类型合成msg
                info = json2dict(var['info'])
                state_text = '操作成功，' if info['state'] == 'SUCCESS' else '操作失败：'
                if var['type'] == 1:
                    msg = '%s，%sTable: %s' % (self.config_type[1], state_text, info['table'])
                elif var['type'] == 2:
                    msg = '%s，%sTable: %s - ID: %s' % (self.config_type[2], state_text, info['table'], info['id'])
                elif var['type'] == 3:
                    msg = '%s，%sTable: %s - ID: %s' % (self.config_type[3], state_text, info.get('table', ''), info.get('where'))
                elif var['type'] == 4:
                    msg = '%s，%sTable: %s - ID: %s' % (self.config_type[4], state_text, info.get('table', ''), info.get('where'))
                elif var['type'] == 5:
                    msg = '%s%s' % (state_text, info.get('msg', ''))  # 其它数据库操作
                elif var['type'] == 6:  # 后台登录
                    if info.get('action', '') == 'logout':
                        msg = '退出后台登录'
                    else:
                        msg = '成功登录后台' if info['state'] == 'SUCCESS' else '登录失败：%s' % info['msg']
                elif var['type'] == 7:
                    if info['state'] == 'SUCCESS':
                        msg = '%s，文件名: %s' % (self.config_type[7], info['filename'])
                    else:
                        msg = '%s，操作失败: %s' % (self.config_type[7], info['msg'])
                elif var['type'] == 8:
                    msg = '%s' % self.config_type[8]
                elif var['type'] == 9:
                    msg = '%s：%s' % (self.config_type[9], info['msg'])
                elif var['type'] == 10:
                    msg = '%s：%s' % (self.config_type[9], info['msg'])
                elif var['type'] == 11:  # 前台登录
                    if info.get('action', '') == 'logout':
                        msg = '退出前台登录'
                    else:
                        msg = '成功登录前台' if info['state'] == 'SUCCESS' else '登录失败：%s' % info['msg']
                elif var['type'] == 12:  # 文件下载
                    msg = '%s' % self.config_type[12]
                else:
                    msg = '进行未知操作'

                # 判断是否可以删除，0不行1可以
                is_del = 0
                if (int(self.kg['run_start_time'][1]) - var['addtime']) > self.day * 86400 and self.db.total_rows > self.sql_row:
                    is_del = 1

                # 整形数据
                var['state'] = info['state']
                var['admin'] = [var.get('adminid', ''), info.get('loginid', '')]
                var['user'] = [var.get('userid', ''), info.get('loginid', '')]
                var['msg'] = msg
                var['sql'] = info.get('sql', '')  # 部分数据库操作会记录完整URL
                var['interval'] = time_check(var['addtime'])
                var['time'] = date(var['addtime'])
                var['is_del'] = is_del  # 是否可以删除
                var['loginid'] = json2dict(var['loginid']) if json2dict(var['loginid']) else {}


        return log_list
