import os
from functools import lru_cache
from typing import Any
from pydantic import Field, SecretStr, validator
from pydantic_settings import BaseSettings


class Settings(BaseSettings):
    environment: str = Field("production", env="ENVIRONMENT")
    frontend_url: str = Field(..., env="FRONTEND_URL")
    database_url: str = Field(..., env="DATABASE_URL")
    captcha_secret: SecretStr = Field(..., env="CAPTCHA_SECRET")
    rate_limit: str = Field("3/hour", env="RATE_LIMIT")
    trust_env: bool = True

    @validator("frontend_url")
    def validate_frontend_url(cls, value: str) -> str:
        if not value.startswith(("https://", "http://")):
            raise ValueError("FRONTEND_URL must be a valid URL starting with http:// or https://")
        return value

    class Config:
        env_file = os.path.join(os.path.dirname(__file__), "..", ".env")
        env_file_encoding = "utf-8"


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