import os
import logging

from modules.api.api_setup import setup_api_args, setup_model_args, setup_uvicon_args
from modules.ffmpeg_env import setup_ffmpeg_path

setup_ffmpeg_path()
logging.basicConfig(
    level=os.getenv("LOG_LEVEL", "INFO"),
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)

import argparse
import uvicorn

from modules import config
from modules.utils import env

from fastapi import FastAPI

logger = logging.getLogger(__name__)

if __name__ == "__main__":
    import dotenv

    dotenv.load_dotenv(
        dotenv_path=os.getenv("ENV_FILE", ".env.api"),
    )
    parser = argparse.ArgumentParser(
        description="Start the FastAPI server with command line arguments"
    )
    setup_api_args(parser)
    setup_model_args(parser)
    setup_uvicon_args(parser=parser)

    args = parser.parse_args()

    host = env.get_and_update_env(args, "host", "0.0.0.0", str)
    port = env.get_and_update_env(args, "port", 7870, int)
    reload = env.get_and_update_env(args, "reload", False, bool)
    workers = env.get_and_update_env(args, "workers", 1, int)
    log_level = env.get_and_update_env(args, "log_level", "info", str)
    access_log = env.get_and_update_env(args, "access_log", True, bool)
    proxy_headers = env.get_and_update_env(args, "proxy_headers", True, bool)
    timeout_keep_alive = env.get_and_update_env(args, "timeout_keep_alive", 5, int)
    timeout_graceful_shutdown = env.get_and_update_env(
        args, "timeout_graceful_shutdown", 0, int
    )
    ssl_keyfile = env.get_and_update_env(args, "ssl_keyfile", None, str)
    ssl_certfile = env.get_and_update_env(args, "ssl_certfile", None, str)
    ssl_keyfile_password = env.get_and_update_env(
        args, "ssl_keyfile_password", None, str
    )

    uvicorn.run(
        "modules.api.worker:app",
        host=host,
        port=port,
        reload=reload,
        workers=workers,
        log_level=log_level,
        access_log=access_log,
        proxy_headers=proxy_headers,
        timeout_keep_alive=timeout_keep_alive,
        timeout_graceful_shutdown=timeout_graceful_shutdown,
        ssl_keyfile=ssl_keyfile,
        ssl_certfile=ssl_certfile,
        ssl_keyfile_password=ssl_keyfile_password,
    )