import logging
import enum
import dataclasses
import dataclasses_json
import multiprocessing
import traceback
import subprocess
import os
import sys
import json
from typing import (
    Any,
    Literal,
    Optional,
    Iterable,
)

logger = logging.getLogger(__name__)

#logging.getLogger().setLevel(logging.INFO)

class tiktok_config_t:
    @dataclasses_json.dataclass_json
    @dataclasses.dataclass
    class res_t:
        project_root: str=''
        cache: str=''
        videos: str=''
        audios: str=''
        celery_broker: str=''
        celery_result_backend: str=''
        celery_imports: Iterable[str]=tuple()
        celery_log_level: int=logging.INFO

def tiktok_config() -> tiktok_config_t.res_t:
    res = tiktok_config_t.res_t(
        project_root=os.path.abspath(
            os.path.join(
                os.path.dirname(__file__),
                '..', '..', '..',
            ),
        ),
    )

    res.celery_broker = 'redis://redis:6379/1'
    res.celery_result_backend = 'redis://redis:6379/2'
    res.celery_imports = ['python.tasks.tiktok.tasks']
    res.cache = os.path.join(
        res.project_root,
        'tmp/cache/tiktok',
    )
    res.videos = os.path.join(
        res.cache,
        'videos',
    )
    res.audios = os.path.join(
        res.cache,
        'audios',
    )

    os.makedirs(res.videos, exist_ok=True)
    os.makedirs(res.audios, exist_ok=True)

    return res

def logger_setup(name: str) -> logging.Logger:
    logger = logging.getLogger(name)
    if len(logger.handlers) == 0:
        handler = logging.StreamHandler(sys.stderr)
        logger.addHandler(handler)
        logger.setLevel(logging.INFO)

    return logger

logger = logger_setup(__name__)