import os
import logging
from pathlib import Path
from datetime import datetime

from prometheus_async.aio import time

from barcode_server.barcode import BarcodeEvent
from barcode_server.notifier import BarcodeNotifier
from barcode_server.stats import FILE_NOTIFIER_TIME
from barcode_server.util import barcode_event_to_json

LOGGER = logging.getLogger(__name__)

class FileNotifier(BarcodeNotifier):

    def __init__(self, path: str):
        super().__init__()
        self.inputDevicePathA = None
        self.inputDevicePathB = None
        self.path = path
        pathObject = Path(path)
        if not pathObject.exists():
            pathObject.mkdir(exist_ok=True)

    # def ticks(dt):
    #    return (dt - datetime(1, 1, 1)).total_seconds() * 10000000

    @time(FILE_NOTIFIER_TIME)
    async def _send_event(self, event: BarcodeEvent):
        now = datetime.now()
        date_time = now.strftime("%Y-%m-%d")
        weekNumberOfYear = now.strftime("%Y_Week_%U")
        if self.inputDevicePathA is None:
            self.inputDevicePathA = event.input_device.path
        elif self.inputDevicePathB is None:
            self.inputDevicePathB = event.input_device.path
        weekPath = f"{self.path}/{weekNumberOfYear}"
        dateTimePath = f"{weekPath}/{date_time}"
        if event.input_device.path == self.inputDevicePathA:
            fullPath = f"{dateTimePath}/A"
        elif event.input_device.path == self.inputDevicePathB:
            fullPath = f"{dateTimePath}/B"
        else:
            fullPath = f"{dateTimePath}/Z"
        json = barcode_event_to_json(self.config.INSTANCE_ID.value, event)
        ticks = int((datetime.utcnow() - datetime(1, 1, 1)).total_seconds() * 10000000)
        pathObject = Path(weekPath)
        if not pathObject.exists():
            pathObject.mkdir(exist_ok=True)
        pathObject = Path(dateTimePath)
        if not pathObject.exists():
            pathObject.mkdir(exist_ok=True)
        pathObject = Path(fullPath)
        if not pathObject.exists():
            pathObject.mkdir(exist_ok=True)
        f = open(f"{fullPath}/{str(ticks)}.json", 'wb')
        f.write(json)
        f.close()
        LOGGER.debug(f"Notified {fullPath}: {event.barcode}")