# -*- coding: utf-8 -*-
"""系统信息"""
import datetime
import json
import logging
import re
import time

from sqlalchemy import text

from website import consts
from website import errors
from website import settings
from website.db_mysql import to_json_list
from website.handler import APIHandler, authenticated
from website.util import sysinfo, rsa_oaep


class VersionHandler(APIHandler):
    @authenticated
    # @permission([100014, 100016])
    def post(self):
        self.finish()


class IdentifycodeHandler(APIHandler):
    """系统识别码"""

    # @authenticated

    # @permission([100014, 100015])
    # @operation_log("资产管理中心", "系统激活", "查询", "查询本地识别码", "查询本地识别码")
    def post(self):
        code = sysinfo.get_identify_code()

        self.finish({"result": code})


class LicenseUploadHandler(APIHandler):
    @authenticated
    # @permission([100014, 100015])
    # @operation_log("资产管理中心", "系统激活", "导入", "上传license文件", "上传license文件")
    def post(self):
        file_metas = self.request.files.get('file', None)
        if not file_metas:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "请上传文件")

        file = file_metas[0]
        filename = file.filename
        # punctuation = """!"#$%&'()*+,/:;<=>?@[\]^`{|}~ """
        # punctuation = """!"#$%&'()*+,/:;<=>?@[\\]^`{|}~ """
        punctuation = r"""!"#$%&'()*+,/:;<=>?@[\]^`{|}~ """

        regex = re.compile('[%s]' % re.escape(punctuation))
        filename = regex.sub("", filename.replace('..', ''))
        file_size = len(file.body)

        if file_size > 10 * 1024 * 1024:
            raise errors.HTTPAPIError(errors.ERROR_METHOD_NOT_ALLOWED, 'Exceed 10M size limit')

        filepath = settings.rsa_license_file

        try:
            body = file['body']
            plaintext = rsa_oaep.decrypt_message_pri(
                open(settings.rsa_private_file).read().strip('\n').encode('utf-8'), body)
            plaintext_json = json.loads(self.tostr(plaintext))

            syscode = plaintext_json["sys_code"]
            expireat = plaintext_json["expire_at"]

            current_syscode = sysinfo.get_idntify_code_v2()
            if syscode != current_syscode:
                raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "license激活失败,请重新激活")

            with self.app_mysql.connect() as conn:
                conn.execute(text(
                    "update sys_license set syscode=:syscode, expireat=:expireat, status=:status",
                    {
                        "syscode": syscode,
                        "expireat": expireat,
                        "status": consts.system_status_activated
                    }
                ))
                conn.commit()

            self.r_app.set("system:license", json.dumps({"syscode": syscode, "expireat": expireat}))

            with open(filepath, 'wb') as f:
                f.write(file['body'])

        except Exception as e:
            logging.info(e)
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "license激活失败,请重新激活")

        self.finish()


class ActivateInfoHandler(APIHandler):
    @authenticated
    # @permission([100014, 100015])
    # @operation_log("资产管理中心", "系统激活", "查询", "查询系统激活信息", "查询系统激活信息")
    def post(self):
        license_str = ""
        activate_at = ""
        expire_at = ""
        date_remain = 0

        row = self.db_app.get(
            "select create_time, expireat from license limit 1"
        )
        if row:
            license_str = open(settings.rsa_license_file, 'r').read()
            activate_at = str(row["create_time"])
            expire_at = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(row["expireat"])))
            now = datetime.datetime.now()
            delta = (datetime.datetime.fromtimestamp(int(row["expireat"])).date() - now.date()).days
            date_remain = delta if delta > 0 else 0

        data = {
            # "system": settings.system_info[settings.system_type]["name"],
            # "license": license_str,
            # "activate_at": activate_at,
            # "expire_at": expire_at,
            # "date_remain": date_remain
        }

        self.finish(data)


class InfoHandler(APIHandler):
    def post(self):
        self.finish()


class LogHandler(APIHandler):
    @authenticated
    def post(self):
        user = self.get_escaped_argument("user", "")
        start = self.get_escaped_argument("startDate", "")
        end = self.get_escaped_argument("endDate", "")
        pageNo = self.get_int_argument("pageNo", 1)
        pageSize = self.get_int_argument("pageSize", consts.PAGE_SIZE)

        user_list = user.split(",") if user else []
        with self.app_mysql.connect() as conn:
            sql = "select user, ip, content, op_type, content, create_time from sys_log where 1=1"
            sql_count = "select count(*) from sys_log where 1=1"
            p = {}
            if user_list:
                sql += " and user in :users"
                sql_count += " and user in :users"
                p["users"] = user_list
            if start:
                sql += " and date_format(create_time, '%Y-%m-%d') >= :start"
                sql_count += " and date_format(create_time, '%Y-%m-%d') >= :start"
                p["start"] = start
            if end:
                sql += " and date_format(create_time, '%Y-%m-%d') <= :end"
                sql_count += " and date_format(create_time, '%Y-%m-%d') <= :end"
                p["end"] = end

            count = conn.scalar(text(sql_count), p)

            sql += " order by create_time desc limit :pageNo, :pageSize"
            p["pageNo"] = (pageNo - 1) * pageSize
            p["pageSize"] = pageSize
            res = conn.execute(text(sql), p)
            data = to_json_list(res)
            for item in data:
                item["create_time"] = str(item["create_time"])

            self.finish({"count": count, "data": data})