import asyncio

from ATRI.service import Service
from ATRI.rule import is_in_service
from ATRI.utils import request
from ATRI.log import logger as log
from ATRI.exceptions import RequestError, WriteFileError
from .image_dealer import image_dealer


TENCENT_AVATER_URL = "https://q1.qlogo.cn/g?b=qq&nk={user_id}&s=640"
SOURCE_URL = "https://cdn.jsdelivr.net/gh/Kyomotoi/CDN@master/project/ATRI/"


class Polaroid(Service):
    def __init__(self):
        Service.__init__(self, "拍立得", "根据头像生成拍立得风格照片!", rule=is_in_service("拍立得"))

    @classmethod
    async def _request(cls, user_id: str) -> bytes:
        try:
            res = await request.get(TENCENT_AVATER_URL.format(user_id=user_id))
        except RequestError:
            raise RequestError("Request failed!")
        data = res.read()
        return data

    @classmethod
    async def generate(cls, user_id: str):
        await init_source()

        user_avater = await cls._request(user_id)

        result = image_dealer(user_avater, user_id)
        return f"file:///{result}"


from .image_dealer import TEMP_PATH, POLAROID_DIR


async def init_source():
    files = ["frame-0.PNG", "frame-1.PNG", "font-0.ttf"]

    for i in files:
        path = POLAROID_DIR / i
        if not path.is_file():
            log.warning("插件 polaroid 缺少所需资源,装载中")

            url = SOURCE_URL + i
            data = await request.get(url)
            try:
                with open(path, "wb") as w:
                    w.write(data.read())
                log.info("所需资源装载完成")
            except WriteFileError:
                raise WriteFileError("装载资源失败")


loop = asyncio.get_event_loop()
loop.create_task(init_source())