import os
from enum import Enum
from pydantic import BaseModel
from typing import Literal, List

class Application(BaseModel):
    name:str = "audio-back-server"
    version:str = "1.0.0"
    description:str = "AudioBack is a web application for managing and streaming audio files."

class Server(BaseModel):
    port:int = 8443
    host:str = "localhost"
    protocol:str = "https"
    ssl_keyfile : str = ""
    ssl_certfile : str = ""
    reload:bool = True
    log_level:str = "info"

class Logging(BaseModel):
    level:Literal['CRITICAL', 'FATAL', 'ERROR', 'WARN', 'WARNING', 'INFO', 'DEBUG'] = "INFO"
    format:str = "%(levelname)s: %(asctime)s - %(name)s - %(levelname)s - %(message)s"
    datefmt:str = "%Y-%m-%d %H:%M:%S"
    filename:str = "app.log"
    filemode:str = "a"

class API(BaseModel):
    prefix:str = "/api/v1"
    tags:List[str|Enum] = ["api"]
    docs:str = "/docs"
    redoc:str = "/redoc"
    openapi:str = "/openapi.json"

class CORS(BaseModel):
    allow_origins:List[str] = ["*"]
    allow_credentials:bool = True
    allow_methods:List[str] = ["*"]
    allow_headers:List[str] = ["*"]

class VideoSource(BaseModel):
    name:str
    type:str
    path:str
    duplicate_stream: bool = False
    disabled : bool = False

class VideoConfiguration(BaseModel):
    sources:List[VideoSource] = []

class YoloConfiguration(BaseModel):
    confidence:float = 0.6
    iou:float = 0.45
    imgsz:int = 640
    device:str = "cpu"
    use_half:bool = True
    min_area_ratio:float = 0.0025
    max_area_ratio:float = 0.8
    max_faces:int = 5

class FaceRecognitionConfiguration(BaseModel):
    detect_width:int = 0
    process_every_n_frames:int = 1
    drop_grab_count:int = 10
    max_broadcast_fps:float = 15.0
    loop_sleep_seconds:float = 0.0

class WebcamConfiguration(BaseModel):
    resolution:str = "1280x720"
    framerate:int = 30

class ServerConfiguration(BaseModel):
    server: Server = Server()
    logging : Logging = Logging()
    api : API = API()
    cors : CORS = CORS()
    application : Application = Application()
    video : VideoConfiguration = VideoConfiguration()
    yolo : YoloConfiguration = YoloConfiguration()
    facerecog : FaceRecognitionConfiguration = FaceRecognitionConfiguration()
    webcam : WebcamConfiguration = WebcamConfiguration()

def is_running_in_docker():
    """Détecte si l'application s'exécute dans un conteneur Docker."""
    # Vérifier l'existence de fichiers spécifiques à Docker
    return os.path.exists('/.dockerenv') or os.environ.get('RUNNING_IN_DOCKER') == 'true'

def is_running_in_windows():
    """Détecte si l'application s'exécute sur un système Windows."""
    return os.name == 'nt'

def is_running_in_linux():
    """Détecte si l'application s'exécute sur un système Linux."""
    return os.name == 'posix' and not is_running_in_docker()
