from __future__ import annotations

from typing import Annotated

from fastapi import Header, Query

Language = str
DEFAULT_LANGUAGE = "en"
SUPPORTED_LANGUAGES = {"en", "or"}

MESSAGES: dict[str, dict[str, str]] = {
    "en": {
        "auth.incorrect_credentials": "Incorrect username or password",
        "auth.inactive_user": "Inactive user",
        "auth.current_password_incorrect": "Current password is incorrect",
        "auth.password_must_change": "New password must be different from the current password",
        "auth.password_changed": "Password changed successfully",
        "users.username_exists": "Username already exists",
        "users.not_found": "User not found",
        "procurement.unknown_stage": "Unknown procurement stage",
        "procurement.not_found": "Record not found",
        "procurement.deleted": "Record deleted",
        "procurement.parent_not_found": "{name} not found",
        "health.ok": "ok",
    },
    "or": {
        "auth.incorrect_credentials": "ବ୍ୟବହାରକାରୀ ନାମ କିମ୍ବା ପାସୱାର୍ଡ ଭୁଲ।",
        "auth.inactive_user": "ବ୍ୟବହାରକାରୀ ସକ୍ରିୟ ନୁହେଁ।",
        "auth.current_password_incorrect": "ବର୍ତ୍ତମାନର ପାସୱାର୍ଡ ଭୁଲ ଅଟେ।",
        "auth.password_must_change": "ନୂତନ ପାସୱାର୍ଡ ବର୍ତ୍ତମାନର ପାସୱାର୍ଡଠାରୁ ଭିନ୍ନ ହେବା ଆବଶ୍ୟକ।",
        "auth.password_changed": "ପାସୱାର୍ଡ ସଫଳତାର ସହ ପରିବର୍ତ୍ତନ ହୋଇଛି।",
        "users.username_exists": "ଏହି ବ୍ୟବହାରକାରୀ ନାମ ପୂର୍ବରୁ ଅଛି।",
        "users.not_found": "ବ୍ୟବହାରକାରୀ ମିଳିଲା ନାହିଁ।",
        "procurement.unknown_stage": "ଅଜଣା କ୍ରୟ ପର୍ଯ୍ୟାୟ।",
        "procurement.not_found": "ରେକର୍ଡ ମିଳିଲା ନାହିଁ।",
        "procurement.deleted": "ରେକର୍ଡ ଡିଲିଟ୍ ହୋଇଛି।",
        "procurement.parent_not_found": "{name} ମିଳିଲା ନାହିଁ।",
        "health.ok": "ଠିକ୍",
    },
}


def normalize_language(value: str | None) -> Language:
    language = (value or DEFAULT_LANGUAGE).split(",")[0].split("-")[0].strip().lower()
    return language if language in SUPPORTED_LANGUAGES else DEFAULT_LANGUAGE


def get_language(
    lang: Annotated[str | None, Query(alias="lang")] = None,
    accept_language: Annotated[str | None, Header(alias="Accept-Language")] = None,
) -> Language:
    return normalize_language(lang or accept_language)


def translate(key: str, language: Language = DEFAULT_LANGUAGE, **params: object) -> str:
    text = MESSAGES.get(language, MESSAGES[DEFAULT_LANGUAGE]).get(key) or MESSAGES[DEFAULT_LANGUAGE].get(key) or key
    return text.format(**params) if params else text


def localized_value(record: object, base_name: str, language: Language = DEFAULT_LANGUAGE) -> str | None:
    suffix = "or" if language == "or" else "en"
    preferred = getattr(record, f"{base_name}_{suffix}", None)
    fallback = getattr(record, f"{base_name}_en", None) or getattr(record, base_name, None)
    return preferred or fallback
