import onepush.core
import yaml
from onepush import get_notifier
from onepush.core import Provider
from onepush.exceptions import OnePushException
from onepush.providers.custom import Custom
from requests import Response

from module.logger import logger
from module.webui.icon import ICON

onepush.core.log = logger


def handle_notify_win(**kwargs) -> bool:
    from winotify import Notification

    toast = Notification(
        app_id='NKAS',
        title=kwargs['title'],
        msg=kwargs['content'],
        icon=ICON.Icon,
        duration='long',
    )
    toast.show()

    logger.info('Push notify success')
    return True


def handle_notify_linux(_config: str, **kwargs) -> bool:
    try:
        config = {}
        for item in yaml.safe_load_all(_config):
            config.update(item)
    except Exception:
        logger.error('Fail to load onepush config, skip sending')
        return False
    try:
        provider_name: str = config.pop('provider', None)
        if provider_name is None:
            logger.info('No provider specified, skip sending')
            return False
        notifier: Provider = get_notifier(provider_name)
        required: list[str] = notifier.params['required']
        config.update(kwargs)

        # pre check
        for key in required:
            if key not in config:
                logger.warning(f"Notifier {notifier.name} require param '{key}' but not provided")

        if isinstance(notifier, Custom):
            if 'method' not in config or config['method'] == 'post':
                config['datatype'] = 'json'
            if not ('data' in config or isinstance(config['data'], dict)):
                config['data'] = {}
            if 'title' in kwargs:
                config['data']['title'] = kwargs['title']
            if 'content' in kwargs:
                config['data']['content'] = kwargs['content']

        if provider_name.lower() == 'gocqhttp':
            access_token = config.get('access_token')
            if access_token:
                config['token'] = access_token

        resp = notifier.notify(**config)
        if isinstance(resp, Response):
            if resp.status_code != 200:
                logger.warning('Push notify failed!')
                logger.warning(f'HTTP Code:{resp.status_code}')
                return False
            else:
                if provider_name.lower() == 'gocqhttp':
                    return_data: dict = resp.json()
                    if return_data['status'] == 'failed':
                        logger.warning('Push notify failed!')
                        logger.warning(f'Return message:{return_data["wording"]}')
                        return False
    except OnePushException:
        logger.exception('Push notify failed')
        return False
    except Exception as e:
        logger.exception(e)
        return False

    logger.info('Push notify success')
    return True
