import asyncio
from datetime import datetime

from ga4mp import GtagMP

from xiaomusic import __version__


class Analytics:
    def __init__(self, log):
        self.gtag = None
        self.current_date = None
        self.log = log
        self.init()

    def init(self):
        if self.gtag is not None:
            return

        gtag = GtagMP(
            api_secret="sVRsf3T9StuWc-ZiWZxDVA",
            measurement_id="G-Z09NC1K7ZW",
            client_id="",
        )
        gtag.client_id = gtag.random_client_id()
        gtag.store.set_user_property(name="version", value=__version__)
        self.gtag = gtag
        self.log.info("analytics init ok")

    async def run_with_cancel(self, func, *args, **kwargs):
        try:
            asyncio.ensure_future(asyncio.to_thread(func, *args, **kwargs))
        except Exception as e:
            self.log.warning(f"analytics run_with_cancel failed {e}")
            return None

    async def send_startup_event(self):
        try:
            await self.run_with_cancel(self._send_startup_event)
        except Exception as e:
            self.log.warning(f"analytics send_startup_event failed {e}")
            self.init()

    def _send_startup_event(self):
        event = self.gtag.create_new_event(name="startup")
        event.set_event_param(name="version", value=__version__)
        event_list = [event]
        self.gtag.send(events=event_list)

    async def send_daily_event(self):
        try:
            await self.run_with_cancel(self._send_daily_event)
        except Exception as e:
            self.log.warning(f"analytics send_daily_event failed {e}")
            self.init()

    def _send_daily_event(self):
        current_date = datetime.now().strftime("%Y-%m-%d")
        if self.current_date == current_date:
            return

        event = self.gtag.create_new_event(name="daily_active_user")
        event.set_event_param(name="version", value=__version__)
        event.set_event_param(name="date", value=current_date)
        event_list = [event]
        self.gtag.send(events=event_list)
        self.current_date = current_date

    async def send_play_event(self, name, sec):
        try:
            await self.run_with_cancel(self._send_play_event, name, sec)
        except Exception as e:
            self.log.warning(f"analytics send_play_event failed {e}")
            self.init()

    def _send_play_event(self, name, sec):
        event = self.gtag.create_new_event(name="play")
        event.set_event_param(name="version", value=__version__)
        event.set_event_param(name="music", value=name)
        event.set_event_param(name="sec", value=sec)
        event_list = [event]
        self.gtag.send(events=event_list)
