# -*- coding: utf-8 -*-
"""
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved 

@Time    : 2024/8/19 下午10:55
@Author  : snowykami
@Email   : snowykami@outlook.com
@File    : rule.py
@Software: PyCharm
"""
import inspect
from typing import Optional, TypeAlias, Callable, Coroutine

from liteyuki.session.event import MessageEvent
from liteyuki import get_config

_superusers: list[str] = get_config("liteyuki.superusers", [])

RuleHandlerFunc: TypeAlias = Callable[[MessageEvent], Coroutine[None, None, bool]]
"""规则函数签名"""


class Rule:
    def __init__(self, handler: RuleHandlerFunc):
        self.handler = handler

    def __or__(self, other: "Rule") -> "Rule":
        async def combined_handler(event: MessageEvent) -> bool:
            return await self.handler(event) or await other.handler(event)

        return Rule(combined_handler)

    def __and__(self, other: "Rule") -> "Rule":
        async def combined_handler(event: MessageEvent) -> bool:
            return await self.handler(event) and await other.handler(event)

        return Rule(combined_handler)

    async def __call__(self, event: MessageEvent) -> bool:
        if self.handler is None:
            return True
        return await self.handler(event)


@Rule
async def empty_rule(event: MessageEvent) -> bool:
    return True

@Rule
async def is_su_rule(event: MessageEvent) -> bool:
    return str(event.user_id) in _superusers