from datetime import datetime, timedelta
from core import utils
from core.base import CommandPlugin
from core.cq import text
from core.utils import get_monday_to_monday

from core.utils import register_plugin
@register_plugin
class RemedyCheckinPlugin(CommandPlugin):
    name = 'remedy_checkin'
    description = '为用户补卡并扣除对应积分。'
    COMMANDS = ("/补卡", "/補卡", "/单日补卡", "/單日補卡", "/超级补卡", "/超級補卡")

    YEARLY_LIMIT = 4

    def _check_remedy_limit(self, user_id, year):
        used = self.dbmanager.checkin.remedy_used(year, user_id)
        if used >= self.YEARLY_LIMIT:
            self.api.send_msg(text("{}年补卡次数已达上限（{}/{}）".format(year, used, self.YEARLY_LIMIT)))
            return False
        return True

    def handle(self):
        if self.bot_event.user_id == None:
            return

        super_mode = self.cmd in ("/超级补卡", "/超級補卡")

        if self.cmd in ("/单日补卡", "/單日補卡"):
            self.handle_single_day_remedy()
            return

        if len(self.args) > 0:
            try:
                dt = datetime.strptime(self.args[0], "%Y-%m-%d") + timedelta(hours=8)
            except Exception as e:
                self.api.send_msg(text("{}格式不正确".format(self.args[0])))
                return

            user_id = self.bot_event.user_id
            if len(self.args) > 1:
                user_id = self.args[1] # 特殊补卡指令可以给其他人补卡

            start, end = get_monday_to_monday(dt)
            rows = self.dbmanager.checkin.search_user_range(user_id, start, end)

            cost = 4

            if len(rows) == 0:
                if not super_mode and not self._check_remedy_limit(user_id, dt.year):
                    return
                points = self.dbmanager.points.get(user_id)
                if points >= cost or super_mode:
                    success_msg = "{}-{}原来没有打卡吗？真拿你没办法……\n*涂写*好了帮你补上了喵，一共消费{}点数，谢谢惠顾喵"
                    self.api.send_msg(text(success_msg.format(start.split(" ")[0], end.split(" ")[0], cost)))
                    self.dbmanager.checkin.remedy_week(user_id, start.split(" ")[0])
                    if not super_mode:
                        utils.add_user_point(self.dbmanager, user_id, cost * -1)
                        self.dbmanager.checkin.add_remedy_used(dt.year, user_id, 1)
                else:
                    self.api.send_msg(text("补卡当然不是免费的喵!\n你现在现在点数是：{}\n补卡需要{}点喵".format(points, cost)))
            else:
                self.api.send_msg(text("上当了喵！{}-{}你已经打过卡了喵！".format(start.split(" ")[0], end.split(" ")[0])))

        else:
            self.find_remedy()

    def handle_single_day_remedy(self):
        if self.bot_event.user_id == None:
            return

        if len(self.args) <= 0:
            suggest_day = self.find_single_day_remedy()
            if suggest_day is None:
                self.api.send_msg(text("今年每天都打过卡了喵，不需要单日补卡"))
            else:
                self.api.send_msg(text("找到最近漏打卡日期：{}\n可使用指令：/单日补卡 {}".format(suggest_day, suggest_day)))
            return

        try:
            day = datetime.strptime(self.args[0], "%Y-%m-%d")
        except Exception:
            self.api.send_msg(text("{}格式不正确".format(self.args[0])))
            return

        day_start = day.strftime("%Y-%m-%d 08:00:00")
        day_end = (day + timedelta(days=1)).strftime("%Y-%m-%d 08:00:00")
        user_id = self.bot_event.user_id

        rows = self.dbmanager.checkin.search_user_range(user_id, day_start, day_end)
        if len(rows) > 0:
            self.api.send_msg(text("{} 这一天你已经打过卡了喵".format(self.args[0])))
            return

        if not self._check_remedy_limit(user_id, day.year):
            return

        cost = 2
        points = self.dbmanager.points.get(user_id)
        if points < cost:
            self.api.send_msg(text("补卡当然不是免费的喵!\n你现在点数是：{}\n单日补卡需要{}点喵".format(points, cost)))
            return

        self.dbmanager.checkin.remedy_day(user_id, self.args[0])
        utils.add_user_point(self.dbmanager, user_id, cost * -1)
        self.dbmanager.checkin.add_remedy_used(day.year, user_id, 1)
        self.api.send_msg(text("{} 已补卡成功喵，一共消费{}点数".format(self.args[0], cost)))

    def find_single_day_remedy(self):
        # 从昨天开始往前找，返回最近一次未打卡日期（按 8 点结算）
        date = datetime.today() - timedelta(days=1)
        current_year = date.year
        while date.year == current_year:
            day_start = date.strftime("%Y-%m-%d 08:00:00")
            day_end = (date + timedelta(days=1)).strftime("%Y-%m-%d 08:00:00")
            rows = self.dbmanager.checkin.search_user_range(self.bot_event.user_id, day_start, day_end)
            if len(rows) == 0:
                return date.strftime("%Y-%m-%d")
            date = date - timedelta(days=1)
        return None

    def find_remedy(self):
        date = datetime.today()
        current_year = date.year

        while True:
            pre_date = date - timedelta(days=7)
            tmp_start, tmp_end = get_monday_to_monday(pre_date) # 这个函数里已经自带了8小时偏移，正常传入日期即可

            if datetime.strptime(tmp_end, "%Y-%m-%d %H:%M:%S").year != current_year:
                self.api.send_msg(text("{}每一周都打了卡呢！完全不需要补卡喵".format(current_year)))
                break

            rows = self.dbmanager.checkin.search_user_range(self.bot_event.user_id, tmp_start, tmp_end)
            if len(rows) == 0:
                self.api.send_msg(text("找到{}-{}这一周没有打卡喵，使用指令\"/补卡 {}\"确认补卡喵".format(tmp_start.split(" ")[0], tmp_end.split(" ")[0], tmp_start.split(" ")[0])))
                break

            date = pre_date

