# -*- coding: utf-8 -*

"""
@Software : PyCharm
@File : superuser.py
@Author : 梦影
@Time : 2021/04/25 19:39:50
"""

from plugin.common import robot, bot, static, common
from nonebot.permission import SUPERUSER
from nonebot import CommandSession, on_command
from nonebot.log import logger
import asyncio
import time


class super:
    @staticmethod
    async def new_group_token(session, content):  # 新增一个群的授权
        number = int(content[2]) * 86400
        server = None
        if len(content) == 4:
            server = await static.data(1, content[3])  # 寻找主服务器全称
        sql = "SELECT * FROM main WHERE Value = %s"
        data = await bot.client.query(sql, content[1])
        if not data:
            number = time.time() + number  # 计算授权天数
            sql = "INSERT INTO main(Value, Main, Relet, Users, Robot) VALUES (%s, %s, %s, %s, %s)"
            await bot.client.execute(sql, (content[1], server, number, session.ctx.user_id, session.self_id))
            if not await bot.client.query("SELECT * FROM switch WHERE value = %s", content[1]):
                sql = "INSERT INTO switch(value) VALUES (%s)"  # 插入群开关数据值
                await bot.client.execute(sql, content[1])
            dwTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(number))
            result = f"{list(bot.config.NICKNAME)[0]}·新增时间\n群号:{content[1]}\n新增:{content[2]}\n区服:{server}\n过期:{dwTime}"
            logger.info(result)
            return result
        data = await common.next(data)
        if time.time() > data['Relet']:  # 本地时间大于数据库时间
            number = time.time() + number  # 重新计算授权天数
        else:
            number = data['Relet'] + number  # 计算授权天数,数据库时间小于本地时间
        server = server if server else data['Main']
        sql = "UPDATE main SET Main = %s, Relet = %s, Users = %s, Robot = %s WHERE Value = %s"
        await bot.client.execute(sql, (server, number, session.ctx.user_id, session.self_id, content[1]))  # 更新授权数据
        dwTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(number))
        result = f"{list(bot.config.NICKNAME)[0]}·追加时间\n群号:{content[1]}\n追加:{content[2]}\n区服:{server}\n过期:{dwTime}"
        logger.info(result)
        return result

    @staticmethod
    async def modify_group_token(session, content):  # 修改某个群的授权
        sql = "SELECT * FROM `main` WHERE `Value` = %s"
        data = await bot.client.query(sql, content[1])
        if data:
            data = await common.next(data)
            sql = "UPDATE main SET Value = %s, Users = %s, Robot = %s WHERE ID = %s"
            await bot.client.execute(sql, (content[2], session.ctx.sender['user_id'], session.self_id, data['ID']))
            dwTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(data['Relet']))
            result = f"{list(bot.config.NICKNAME)[0]}·授权信息\n群号:{content[2]}\n区服:{data['Main']}\n过期:{dwTime}"
        else:
            result = "找不到相关信息!"
        logger.info(result)
        return result

    @staticmethod
    async def del_group_token(session, subtext):  # 取消某个群的授权
        sql = "SELECT * FROM main WHERE Value = %s"
        data = await bot.client.query(sql, subtext[1])
        if data:
            sql = "UPDATE main SET Relet = %s, Users = %s, Robot = %s WHERE Value = %s"
            await bot.client.execute(sql, (1582128000, session.ctx.sender['user_id'], session.self_id, subtext[1]))
            result = f"{list(bot.config.NICKNAME)[0]}·授权信息\n已取消对:{subtext[1]} 的授权!"
        else:
            result = "找不到相关信息!"
        logger.info(result)
        return result


hold = super()
Func = {
    "授权群": hold.new_group_token,
    "修改授权": hold.modify_group_token,
    "取消授权": hold.del_group_token
}


@on_command('G', permission=SUPERUSER, only_to_me=True)
async def admin(session: CommandSession):
    content = await common.subtext(session)
    if len(content) >= 2 and content[0] == '发送群消息':  # 发送消息给所有已授权的群
        text = str(session.ctx['message'])[8:]
        for value in bot.config.ROBOT_LIST:
            asyncio.ensure_future(group.send(value, text))
            await asyncio.sleep(0.1)
    if Func.get(content[0], None):
        result = await Func[content[0]](session, content)
        await session.send(result)


class group:
    @staticmethod
    async def send(value: int, message: str):
        logger.info(message)
        group_list = await robot.group_list(self_id=value)
        for group_data in group_list:
            if not await common.token(group_data['group_id']):
                await robot.group_send(self_id=value, group_id=group_data['group_id'], message=message)