from __future__ import annotations

from functools import lru_cache

from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    appwrite_endpoint: str = Field(..., alias="APPWRITE_ENDPOINT")
    appwrite_project_id: str = Field(..., alias="APPWRITE_PROJECT_ID")
    appwrite_api_key: str = Field(..., alias="APPWRITE_API_KEY")
    appwrite_database_id: str = Field(..., alias="APPWRITE_DATABASE_ID")
    appwrite_collection_produtos_catalogo_id: str = Field(
        ..., alias="APPWRITE_COLLECTION_PRODUTOS_CATALOGO_ID"
    )
    appwrite_collection_produtos_venda_id: str = Field(
        ..., alias="APPWRITE_COLLECTION_PRODUTOS_VENDA_ID"
    )
    appwrite_session_cookie: str | None = Field(
        default=None, alias="APPWRITE_SESSION_COOKIE"
    )
    appwrite_collection_faturas_id: str = Field(..., alias="APPWRITE_COLLECTION_FATURAS_ID")
    appwrite_collection_laboratorios_id: str = Field(..., alias="APPWRITE_COLLECTION_LABORATORIOS_ID")
    appwrite_collection_categorias_id: str = Field(..., alias="APPWRITE_COLLECTION_CATEGORIAS_ID")
    appwrite_collection_subcategorias_id: str = Field(..., alias="APPWRITE_COLLECTION_SUBCATEGORIAS_ID")
    appwrite_collection_usuarios_id: str = Field(..., alias="APPWRITE_COLLECTION_USUARIOS_ID")
    appwrite_collection_usuarios_data_id: str = Field(
        ..., alias="APPWRITE_COLLECTION_USUARIOS_DATA_ID"
    )
    appwrite_collection_usuarios_perfil_id: str = Field(
        ..., alias="APPWRITE_COLLECTION_USUARIOS_PERFIL_ID"
    )
    appwrite_collection_usuario_empresa_perfis_id: str = Field(
        ..., alias="APPWRITE_COLLECTION_USUARIO_EMPRESA_PERFIS_ID"
    )
    appwrite_collection_empresas_id: str = Field(..., alias="APPWRITE_COLLECTION_EMPRESAS_ID")
    appwrite_collection_empresas_dados_id: str = Field(
        ..., alias="APPWRITE_COLLECTION_EMPRESAS_DADOS_ID"
    )
    appwrite_collection_empresas_socios_id: str = Field(
        ..., alias="APPWRITE_COLLECTION_EMPRESAS_SOCIOS_ID"
    )
    appwrite_collection_enderecos_id: str = Field(..., alias="APPWRITE_COLLECTION_ENDERECOS_ID")
    appwrite_collection_entregas_id: str = Field(
        default="", alias="APPWRITE_COLLECTION_ENTREGAS_ID"
    )
    appwrite_collection_carrinhos_id: str = Field(..., alias="APPWRITE_COLLECTION_CARRINHOS_ID")
    appwrite_collection_pedidos_id: str = Field(..., alias="APPWRITE_COLLECTION_PEDIDOS_ID")
    appwrite_collection_pagamentos_id: str = Field(..., alias="APPWRITE_COLLECTION_PAGAMENTOS_ID")
    appwrite_collection_produtos_estoque_id: str = Field(
        ..., alias="APPWRITE_COLLECTION_PRODUTOS_ESTOQUE_ID"
    )
    security_api_key: str | None = Field(default=None, alias="SECURITY_API_KEY")
    jwt_secret: str = Field(..., alias="JWT_SECRET")
    jwt_algorithm: str = Field(default="HS256", alias="JWT_ALGORITHM")
    jwt_access_ttl_seconds: int = Field(default=3600, alias="JWT_ACCESS_TTL_SECONDS")
    session_cookie_name: str = Field(default="session", alias="SESSION_COOKIE_NAME")
    cookie_secure: bool = Field(default=False, alias="COOKIE_SECURE")
    cookie_domain: str | None = Field(default=None, alias="COOKIE_DOMAIN")
    superadmin_identificador: str = Field(
        default="admin", alias="SUPERADMIN_IDENTIFICADOR"
    )
    superadmin_senha: str = Field(default="admin123", alias="SUPERADMIN_SENHA")
    cors_allow_origins: str | None = Field(default=None, alias="CORS_ALLOW_ORIGINS")
    
    # Mercado Pago settings
    mercado_pago_access_token: str = Field(..., alias="MERCADO_PAGO_ACCESS_TOKEN")
    mercado_pago_public_key: str = Field(..., alias="MERCADO_PAGO_PUBLIC_KEY")
    mercado_pago_sandbox: bool = Field(default=True, alias="MERCADO_PAGO_SANDBOX")

    mapbox_access_token: str | None = Field(default=None, alias="MAPBOX_ACCESS_TOKEN")

    model_config = SettingsConfigDict(
        env_file=".env",
        env_file_encoding="utf-8",
        case_sensitive=False,
        extra="ignore",
        populate_by_name=True,
    )


@lru_cache
def get_settings() -> Settings:
    return Settings()
