"""
BookBeach FastAPI Application Configuration
"""
from typing import Any, Dict, Optional
from pydantic import validator, PostgresDsn
from pydantic_settings import BaseSettings
import os
import sys

# Add the backend directory to the Python path for imports
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

try:
    from app.utils.encryption import decrypt_password, is_encrypted
except ImportError:
    # Fallback if encryption module is not available
    def decrypt_password(password, key='babagamma'):
        return password
    def is_encrypted(password, key='babagamma'):
        return False


class Settings(BaseSettings):
    
    def _decrypt_if_needed(self, value: str) -> str:
        """Decrypt a value if it appears to be encrypted"""
        if value and is_encrypted(value):
            try:
                return decrypt_password(value, "babagamma")
            except Exception:
                # If decryption fails, return the original value
                return value
        return value
    # Database settings
    DATABASE_HOST: str = "localhost"
    DATABASE_PORT: int = 5432
    DATABASE_NAME: str = "bookbeach"
    DATABASE_USER: str = "postgres"
    DATABASE_PASSWORD: str = ""
    
    @validator("DATABASE_PASSWORD", pre=True)
    def decrypt_database_password(cls, v):
        if v:
            try:
                from app.utils.encryption import decrypt_password, is_encrypted
                if is_encrypted(v):
                    return decrypt_password(v, "babagamma")
            except Exception:
                pass
        return v
    DATABASE_URL: Optional[PostgresDsn] = None

    @validator("DATABASE_URL", pre=True)
    def assemble_db_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any:
        if isinstance(v, str):
            return v
        return f"postgresql://{values.get('DATABASE_USER')}:{values.get('DATABASE_PASSWORD')}@{values.get('DATABASE_HOST')}:{values.get('DATABASE_PORT')}/{values.get('DATABASE_NAME')}"

    # API Settings
    API_HOST: str = "0.0.0.0"
    API_PORT: int = 8000
    API_RELOAD: bool = True
    DEBUG: bool = True
    ENVIRONMENT: str = "development"

    # Security settings
    SECRET_KEY: str = "your-super-secret-key-change-this-in-production"
    ALGORITHM: str = "HS256"
    ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
    REFRESH_TOKEN_EXPIRE_DAYS: int = 7
    PASSWORD_RESET_TOKEN_EXPIRE_MINUTES: int = 15
    EMAIL_VERIFICATION_TOKEN_EXPIRE_MINUTES: int = 15

    # Email settings
    MAIL_SERVER: str = "mail.bookbeach.app"
    MAIL_PORT: int = 587
    MAIL_USE_TLS: bool = True
    MAIL_USE_SSL: bool = False
    MAIL_USERNAME: str = "noreply@bookbeach.app"
    MAIL_PASSWORD: str = ""
    
    @validator("MAIL_PASSWORD", pre=True)
    def decrypt_mail_password(cls, v):
        if v:
            try:
                from app.utils.encryption import decrypt_password, is_encrypted
                if is_encrypted(v):
                    return decrypt_password(v, "babagamma")
            except Exception:
                pass
        return v
    MAIL_FROM: str = "noreply@bookbeach.app"
    MAIL_FROM_NAME: str = "BookBeach"

    # Support email settings
    SUPPORT_EMAIL: str = "support@bookbeach.app"
    SUPPORT_PASSWORD: str = ""
    
    @validator("SUPPORT_PASSWORD", pre=True)
    def decrypt_support_password(cls, v):
        if v:
            try:
                from app.utils.encryption import decrypt_password, is_encrypted
                if is_encrypted(v):
                    return decrypt_password(v, "babagamma")
            except Exception:
                pass
        return v
    EVALUATION_EMAIL: str = "evaluation@bookbeach.app"
    EVALUATION_PASSWORD: str = ""
    
    @validator("EVALUATION_PASSWORD", pre=True)
    def decrypt_evaluation_password(cls, v):
        if v:
            try:
                from app.utils.encryption import decrypt_password, is_encrypted
                if is_encrypted(v):
                    return decrypt_password(v, "babagamma")
            except Exception:
                pass
        return v

    # Application settings
    APP_NAME: str = "BookBeach"
    APP_VERSION: str = "1.0.0"
    APP_DESCRIPTION: str = "Beach Sunbed Booking Platform"
    WEBSITE_URL: str = "https://bookbeach.app"
    FRONTEND_URL: str = "http://localhost:4200"
    ADMIN_URL: str = "http://localhost:8001"

    # File upload settings
    MAX_FILE_SIZE: int = 10485760  # 10MB
    ALLOWED_IMAGE_EXTENSIONS: str = "jpg,jpeg,png,gif,webp"
    UPLOAD_FOLDER: str = "./uploads"
    STATIC_FOLDER: str = "./static"

    # External APIs
    GOOGLE_MAPS_API_KEY: str = ""
    EXCHANGE_RATE_API_KEY: str = ""
    EXCHANGE_RATE_API_URL: str = "https://api.exchangerate-api.com/v4/latest/"

    # Redis settings
    REDIS_HOST: str = "localhost"
    REDIS_PORT: int = 6379
    REDIS_DB: int = 0
    REDIS_PASSWORD: str = ""

    # Celery settings
    CELERY_BROKER_URL: str = "redis://localhost:6379/1"
    CELERY_RESULT_BACKEND: str = "redis://localhost:6379/2"

    # Pagination settings
    DEFAULT_PAGE_SIZE: int = 20
    MAX_PAGE_SIZE: int = 100

    # Business settings
    PLATFORM_COMMISSION_PERCENTAGE: float = 5.0
    DEFAULT_CURRENCY: str = "EUR"
    DEFAULT_LANGUAGE: str = "en"
    VAT_PERCENTAGE: float = 24.0

    # Logging settings
    LOG_LEVEL: str = "INFO"
    LOG_FILE: str = "./logs/bookbeach.log"

    # CORS settings
    CORS_ORIGINS: list = [
        "http://localhost:4200",
        "http://localhost:3000",
        "https://bookbeach.app"
    ]

    # Admin settings
    ADMIN_EMAIL: str = "admin@bookbeach.app"
    ADMIN_PASSWORD: str = "AdminPassword123!"
    
    @validator("ADMIN_PASSWORD", pre=True)
    def decrypt_admin_password(cls, v):
        if v:
            try:
                from app.utils.encryption import decrypt_password, is_encrypted
                if is_encrypted(v):
                    return decrypt_password(v, "babagamma")
            except Exception:
                pass
        return v

    # Booking settings
    MIN_BOOKING_HOURS: int = 1
    MAX_BOOKING_HOURS: int = 12
    BOOKING_ADVANCE_DAYS: int = 30
    DEFAULT_REFUND_HOURS: int = 24

    class Config:
        env_file = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), ".env")
        case_sensitive = True


settings = Settings()