import os
from pathlib import Path

from dotenv import load_dotenv

path = Path(os.path.dirname(os.path.dirname(__file__)))
project_root_dir = str(path.parent)
env_path = Path(project_root_dir) / ".env"
load_dotenv(env_path)

api_dir = str(path)
storage_dir = os.path.join(project_root_dir, "storage")
storage_app_dir = os.path.join(storage_dir, "app")

""" basedir = Path(__file__).resolve().parent  # pyapi directory
project_root = basedir.parent.parent  # project root directory
 """


class Config:
    """Base configuration."""

    SECRET_KEY = os.getenv("APP_KEY", "your_default_secret_key")
    DEBUG = os.getenv("DEBUG", "False") == "True"
    TESTING = os.getenv("TESTING", "False") == "True"
    JSONIFY_PRETTYPRINT_REGULAR = (
        os.getenv("JSONIFY_PRETTYPRINT_REGULAR", "True") == "True"
    )
    LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO").upper()
    LOG_DIR = os.path.join(storage_dir, "logs")

    LOG_MAX_BYTES = int(os.environ.get("LOG_MAX_BYTES", 10 * 1024 * 1024))  # 10MB
    LOG_BACKUP_COUNT = int(os.environ.get("LOG_DAILY_DAYS", 14))
    LOG_FORMAT = os.environ.get(
        "LOG_FORMAT", "[%(asctime)s] %(name)s.%(levelname)s: %(message)s"
    )
    LOG_DATE_FORMAT = os.environ.get("LOG_DATE_FORMAT", "%Y-%m-%d %H:%M:%S")

    # MySQL Configuration - Multiple Database Support
    MYSQL_DATABASES = {
        "default": {
            "host": os.getenv("DB_HOST", "localhost"),
            "port": int(os.getenv("DB_PORT", "3306")),
            "database": os.getenv("DB_DATABASE"),
            "username": os.getenv("DB_USERNAME"),
            "password": os.getenv("DB_PASSWORD"),
            "collation": os.getenv("DB_COLLATION", "utf8mb4_unicode_ci"),
            "sql_mode": os.getenv("DB_SQL_MODE", "NO_ENGINE_SUBSTITUTION"),
        }
    }

    # Legacy MySQL Configuration (for backward compatibility)
    MYSQL_HOST = MYSQL_DATABASES["default"]["host"]
    MYSQL_PORT = MYSQL_DATABASES["default"]["port"]
    MYSQL_DATABASE = MYSQL_DATABASES["default"]["database"]
    MYSQL_USERNAME = MYSQL_DATABASES["default"]["username"]
    MYSQL_PASSWORD = MYSQL_DATABASES["default"]["password"]
    MYSQL_COLLATION = MYSQL_DATABASES["default"]["collation"]

    CORS_ORIGINS = os.getenv("APP_URL").split(",")
    CORS_METHODS = ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"]
    CORS_ALLOW_HEADERS = [
        "Content-Type",
        "Authorization",
        "X-Requested-With",
        "Accept",
        "Origin",
        "X-CSRF-Token",
        "X-API-Key",
    ]
    CORS_MAX_AGE = 600
    CORS_SUPPORTS_CREDENTIALS = True

    # API Authentication
    API_KEYS = os.getenv("API_KEYS", "").split(",") if os.getenv("API_KEYS") else []

    # Cache Configuration
    CACHE_TYPE = os.getenv(
        "PYTHON_API_CACHE_STORE", "filesystem"
    )  # redis, simple, filesystem
    CACHE_DIR = os.path.join(storage_dir, "framework", "cache", "data", "pyapi")
    CACHE_KEY_PREFIX = os.getenv("PYTHON_API_CACHE_PREFIX", "py_qpgs_api")
    CACHE_DEFAULT_TIMEOUT = 300
    CACHE_THRESHOLD = 500
    CACHE_FILE_MODE = 0o777

    # Cache TTL configurations (in seconds)
    CACHE_TTL_SHORT = 60  # 1 minute - for frequently changing data
    CACHE_TTL_MEDIUM = 300  # 5 minutes - for reports
    CACHE_TTL_LONG = 3600  # 1 hour - for stats and metadata
    CACHE_TTL_VERY_LONG = 86400  # 24 hours - for static/config data

    # Pandoc global configuration
    PANDOC_LOCATION = os.getenv("PANDOC_URL", "/usr/bin/pandoc")

    # Node JS binary path
    NODE_JS_PATH = "node"

    # PDF configuration
    PDF_STORAGE_DIR = os.path.join(storage_app_dir, "public", "pdf")
    DOCX_STORAGE_DIR = os.path.join(storage_app_dir, "public", "docx")
    TEMPLATE_DIR = os.path.join(storage_app_dir, "private", "templates")
    TEMPORARY_DIR = os.path.join(storage_app_dir, "public", "temp")
    PRIVATE_TEMPORARY_DIR = os.path.join(storage_app_dir, "private", "temp")
    PROPHET_MODEL_DIR = os.path.join(storage_dir, "framework", "prophet_models")

    # Azure OpenAI Configuration
    AZURE_OPENAI_API_KEY = os.getenv("AZURE_OPENAI_API_KEY")
    AZURE_OPENAI_ENDPOINT = os.getenv("AZURE_OPENAI_API_ENDPOINT")
    AZURE_OPENAI_API_VERSION = os.getenv("AZURE_OPENAI_API_VERSION")
    AZURE_OPENAI_DEPLOYMENT_NAME = os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME")

    @classmethod
    def get_mysql_config(cls, database_name: str = "default"):
        """Get MySQL connection configuration for specified database"""
        if database_name not in cls.MYSQL_DATABASES:
            raise ValueError(
                f"Database '{database_name}' not configured. Available databases: {list(cls.MYSQL_DATABASES.keys())}"
            )

        db_config = cls.MYSQL_DATABASES[database_name]
        return {
            "host": db_config["host"],
            "port": db_config["port"],
            "database": db_config["database"],
            "user": db_config["username"],
            "password": db_config["password"],
            "charset": "utf8mb4",
            "collation": db_config["collation"],
            "sql_mode": db_config["sql_mode"],
            "autocommit": True,
            "pool_name": f"mysql_pool_{database_name}",
            "pool_size": 3,  # was 10
            "pool_reset_session": True,
            "connection_timeout": 30,
            "buffered": True,
            "read_timeout": 10,  # seconds — gives cmd_ping() a deadline instead of blocking forever
            "connect_timeout": 10,
        }

    @classmethod
    def get_available_databases(cls):
        """Get list of available database configurations"""
        return list(cls.MYSQL_DATABASES.keys())


class DevelopmentConfig(Config):
    """Development configuration."""

    DEBUG = True
    LOG_LEVEL = "DEBUG"


class TestingConfig(Config):
    """Testing configuration."""

    TESTING = True
    LOG_LEVEL = "WARNING"

    # Pandoc global configuration
    PANDOC_LOCATION = os.getenv("PANDOC_URL", "/usr/bin/pandoc")

    # Node JS binary path
    NODE_JS_PATH = "/opt/plesk/node/18/bin/node"


class ProductionConfig(Config):
    """Production configuration."""

    DEBUG = False
    LOG_LEVEL = "INFO"

    # Pandoc global configuration
    PANDOC_LOCATION = os.getenv("PANDOC_URL", "/usr/bin/pandoc")

    # Node JS binary path
    NODE_JS_PATH = "/opt/plesk/node/18/bin/node"


config = {
    "development": DevelopmentConfig,
    "production": ProductionConfig,
    "testing": TestingConfig,
    "default": DevelopmentConfig,
}
