"""
config.py — ค่าตั้งต้นทั้งหมดของระบบ อ่านจาก Environment Variable ได้
ทุกค่ามีค่า default ที่ใช้งานได้ทันที ไม่ต้องตั้ง .env ก็รันได้
"""
import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent      # .../backend
MODEL_DIR = BASE_DIR / "models"

# โหลดค่าจากไฟล์ .env เข้าสู่ environment ก่อนอ่านค่าใดๆ
# ทำในโค้ด Python แทนการวนอ่านใน .bat เพราะ cmd.exe จัดการ UTF-8 ได้ไม่ดี
_ENV_FILE = BASE_DIR / ".env"
if _ENV_FILE.is_file():
    try:
        from dotenv import load_dotenv
        load_dotenv(_ENV_FILE, override=False)
    except ImportError:
        # สำรอง: อ่านเองแบบง่ายๆ เผื่อยังไม่ได้ติดตั้ง python-dotenv
        for _line in _ENV_FILE.read_text(encoding="utf-8-sig").splitlines():
            _line = _line.strip()
            if not _line or _line.startswith("#") or "=" not in _line:
                continue
            _k, _v = _line.split("=", 1)
            os.environ.setdefault(_k.strip(), _v.strip().strip('"').strip("'"))


def _env_bool(key: str, default: bool) -> bool:
    return os.getenv(key, str(default)).strip().lower() in ("1", "true", "yes", "on")


class Settings:
    # ---------------- ที่อยู่โฟลเดอร์ ----------------
    # ต้องประกาศเป็น attribute ของคลาสด้วย ไม่ใช่แค่ตัวแปรระดับโมดูล
    # เพราะโค้ดส่วนอื่นเรียกผ่าน settings.BASE_DIR / settings.MODEL_DIR
    BASE_DIR = BASE_DIR
    MODEL_DIR = MODEL_DIR

    # ---------------- เซิร์ฟเวอร์ ----------------
    HOST: str = os.getenv("APP_HOST", "0.0.0.0")
    PORT: int = int(os.getenv("APP_PORT", "8000"))

    # CORS: หน้าเว็บอยู่บน XAMPP พอร์ต 80 ส่วน API อยู่พอร์ต 8000 → คนละ origin
    # หน้างานเป็น LAN ปิด จึงเปิด "*" ได้ ถ้าออกอินเทอร์เน็ตให้ระบุโดเมนจริง
    CORS_ORIGINS: list = [o.strip() for o in os.getenv("CORS_ORIGINS", "*").split(",")]

    # ---------------- Stage 1 : YOLO ----------------
    # ถ้ามีไฟล์โมเดลที่เทรนมาสำหรับป้ายทะเบียนโดยเฉพาะ ให้วางไว้ที่ backend/models/
    # ระบบจะเลือกใช้ไฟล์แรกที่เจอตามลำดับนี้โดยอัตโนมัติ
    PLATE_MODEL_CANDIDATES: list = [
        os.getenv("PLATE_MODEL", ""),                  # กำหนดเองผ่าน env ได้
        str(MODEL_DIR / "license_plate.pt"),
        str(MODEL_DIR / "license_plate_detector.pt"),
        str(MODEL_DIR / "best.pt"),
    ]
    # โมเดลสำรอง (ตรวจจับ "รถ" ตาม COCO) — ดาวน์โหลดอัตโนมัติครั้งแรกโดย ultralytics
    FALLBACK_MODEL: str = os.getenv("FALLBACK_MODEL", str(MODEL_DIR / "yolov8n.pt"))

    YOLO_CONF: float = float(os.getenv("YOLO_CONF", "0.25"))   # ต่ำหน่อย เพราะป้ายแดดจ้าคอนทราสต์เพี้ยน
    YOLO_IMGSZ: int = int(os.getenv("YOLO_IMGSZ", "640"))
    YOLO_DEVICE: str = os.getenv("YOLO_DEVICE", "cpu")         # 'cpu' หรือ '0' ถ้ามี GPU

    # ---------------- Stage 2 : EasyOCR ----------------
    OCR_LANGS: list = [s.strip() for s in os.getenv("OCR_LANGS", "th,en").split(",")]
    OCR_GPU: bool = _env_bool("OCR_GPU", False)
    OCR_MIN_CONF: float = float(os.getenv("OCR_MIN_CONF", "0.20"))

    # ต้องอ่านได้ตรงกันกี่ variant จึงถือว่า "มั่นใจ" (ต่ำกว่านี้ = ขึ้นเตือนให้พนักงานตรวจ)
    # ตั้ง 1 = ปิดระบบโหวต (เร็วขึ้นแต่เสี่ยงอ่านผิดแบบเงียบ ไม่แนะนำ)
    MIN_VOTES: int = int(os.getenv("MIN_VOTES", "2"))

    # งบประมาณเวลาสูงสุดต่อการสแกน 1 ครั้ง (วินาที) — เกินแล้วใช้ผลเท่าที่ได้
    # กันกรณีตกมาโหมด "อ่านทั้งภาพ" ซึ่งช้ากว่าอ่านเฉพาะป้ายราว 10 เท่า
    MAX_SCAN_SECONDS: float = float(os.getenv("MAX_SCAN_SECONDS", "20"))

    # ---------------- กติกาป้ายทะเบียนรถบรรทุก ----------------
    # หมวดป้ายรถบรรทุกตาม พ.ร.บ.การขนส่งทางบก 2522 (เลข 2 หลัก + เลข 4 หลัก)
    #   60–69, 70–79 = รถบรรทุกไม่ประจำทาง/รับจ้าง (ป้ายเหลืองตัวหนังสือดำ)
    #   50–59, 80–99 = รถบรรทุกส่วนบุคคล บริษัท/โรงงานใช้เอง (ป้ายขาวตัวหนังสือดำ)
    # ค่าเริ่มต้น 50–99 = รับรถบรรทุกทุกประเภท (หมวด 10–49 เป็นรถโดยสาร ถูกกันออกอยู่แล้ว)
    PLATE_PREFIX_MIN: int = int(os.getenv("PLATE_PREFIX_MIN", "50"))
    PLATE_PREFIX_MAX: int = int(os.getenv("PLATE_PREFIX_MAX", "99"))

    # ---------------- ฐานข้อมูล ----------------
    # USE_MYSQL=false → ใช้ข้อมูล Mock (ทำงานได้ทันทีโดยไม่ต้องมี DB)
    USE_MYSQL: bool = _env_bool("USE_MYSQL", False)
    DB_HOST: str = os.getenv("DB_HOST", "127.0.0.1")
    DB_PORT: int = int(os.getenv("DB_PORT", "3306"))
    DB_USER: str = os.getenv("DB_USER", "root")
    DB_PASSWORD: str = os.getenv("DB_PASSWORD", "")
    DB_NAME: str = os.getenv("DB_NAME", "truck_queue")

    # ---------------- ระบบ ----------------
    MAX_IMAGE_BYTES: int = int(os.getenv("MAX_IMAGE_BYTES", str(6 * 1024 * 1024)))  # 6 MB
    SAVE_DEBUG_IMAGES: bool = _env_bool("SAVE_DEBUG_IMAGES", True)   # เก็บภาพไว้สอบสวนย้อนหลัง
    DEBUG_DIR = BASE_DIR / "debug_images"
    LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO")


settings = Settings()
