import os
from datetime import timedelta
from dotenv import load_dotenv

# Load environment variables
load_dotenv()

class Config:
    # ============================================
    # DATABASE CONFIGURATION
    # ============================================
    DB_HOST = os.getenv('DB_HOST', 'localhost')
    DB_USER = os.getenv('DB_USER', 'pipinip1_org')
    DB_PASSWORD = os.getenv('DB_PASSWORD', 'Raihanw05')
    DB_NAME = os.getenv('DB_NAME', 'pipinip1_blog')
    DB_PORT = int(os.getenv('DB_PORT', 3306))
    
    if DB_PASSWORD:
        SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}?charset=utf8mb4"
    else:
        SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{DB_USER}@{DB_HOST}:{DB_PORT}/{DB_NAME}?charset=utf8mb4"
    
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_size': 10,
        'pool_recycle': 3600,
        'pool_pre_ping': True,
        'pool_timeout': 30
    }
    
    # ============================================
    # JWT AUTHENTICATION
    # ============================================
    JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY', 'dev-secret-key-change-in-production')
    JWT_REFRESH_SECRET_KEY = os.getenv('JWT_REFRESH_SECRET_KEY', JWT_SECRET_KEY)
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(days=int(os.getenv('JWT_ACCESS_TOKEN_EXPIRES', 7)))
    JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=int(os.getenv('JWT_REFRESH_TOKEN_EXPIRES', 90)))
    JWT_TOKEN_LOCATION = ['headers']
    JWT_HEADER_NAME = 'Authorization'
    JWT_HEADER_TYPE = 'Bearer'
    JWT_ALGORITHM = 'HS256'
    
    # ============================================
    # BCRYPT
    # ============================================
    BCRYPT_LOG_ROUNDS = int(os.getenv('BCRYPT_LOG_ROUNDS', 12))
    
    # ============================================
    # UPLOAD
    # ============================================
    UPLOAD_FOLDER = os.getenv('UPLOAD_FOLDER', 'uploads')
    MAX_CONTENT_LENGTH = int(os.getenv('MAX_CONTENT_LENGTH', 16 * 1024 * 1024))
    ALLOWED_EXTENSIONS = set(os.getenv('ALLOWED_EXTENSIONS', 'png,jpg,jpeg,gif,webp').split(','))
    
    # ============================================
    # GOOGLE OAUTH
    # ============================================
    GOOGLE_CLIENT_ID = os.getenv('GOOGLE_CLIENT_ID')
    GOOGLE_CLIENT_SECRET = os.getenv('GOOGLE_CLIENT_SECRET')
    GOOGLE_REDIRECT_URI = os.getenv('GOOGLE_REDIRECT_URI', 'http://localhost:5000/api/auth/google/callback')
    GOOGLE_AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth'
    GOOGLE_TOKEN_URL = 'https://oauth2.googleapis.com/token'
    GOOGLE_USERINFO_URL = 'https://www.googleapis.com/oauth2/v2/userinfo'
    
    # ============================================
    # CORS CONFIGURATION
    # ============================================
    CORS_ORIGINS = os.getenv('CORS_ORIGINS', '').split(',') if os.getenv('CORS_ORIGINS') else [
        'http://localhost:3000',
        'http://localhost:5000',
        'http://localhost:3001',
        'https://pipinipon.web.id',
        'https://www.pipinipon.web.id',
        'http://pipinipon.web.id',
        'https://blog-pipinipon.vercel.app',
        'https://blog.pipinipon.site',
        'http://blog.pipinipon.site',
        'https://api.pipinipon.site',
        'http://api.pipinipon.site',
        'https://pipinipon.site',
        'http://pipinipon.site'
    ]
    
    CORS_ORIGINS = [origin.strip() for origin in CORS_ORIGINS if origin.strip()]
    CORS_ALLOW_CREDENTIALS = os.getenv('CORS_ALLOW_CREDENTIALS', 'true').lower() == 'true'
    CORS_ALLOW_HEADERS = ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept', 'Origin']
    CORS_ALLOW_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH']
    CORS_EXPOSE_HEADERS = ['Content-Type', 'Authorization']
    CORS_MAX_AGE = 86400
    
    # ============================================
    # EMAIL CONFIGURATION
    # ============================================
    SMTP_HOST = os.getenv('SMTP_HOST', 'mail.pipinipon.site')
    SMTP_PORT = int(os.getenv('SMTP_PORT', 587))
    SMTP_USER = os.getenv('SMTP_USER', 'noreply@blog.pipinipon.site')
    SMTP_PASSWORD = os.getenv('SMTP_PASSWORD', '')
    SMTP_USE_TLS = os.getenv('SMTP_USE_TLS', 'true').lower() == 'true'
    SMTP_USE_SSL = os.getenv('SMTP_USE_SSL', 'false').lower() == 'true'
    MAIL_DEFAULT_SENDER = os.getenv('MAIL_DEFAULT_SENDER', SMTP_USER)
    SMTP_TIMEOUT = int(os.getenv('SMTP_TIMEOUT', 30))
    
    # ============================================
    # FRONTEND URLS
    # ============================================
    FRONTEND_URL = os.getenv('FRONTEND_URL', 'http://localhost:3000')
    FRONTEND_API_URL = os.getenv('FRONTEND_API_URL', FRONTEND_URL)
    
    # ============================================
    # BACKEND CONFIGURATION
    # ============================================
    FLASK_ENV = os.getenv('FLASK_ENV', 'development')
    FLASK_DEBUG = os.getenv('FLASK_DEBUG', 'true').lower() == 'true'
    HOST = os.getenv('HOST', '0.0.0.0')
    PORT = int(os.getenv('PORT', 5000))
    
    # ============================================
    # SECURITY & RATE LIMITING
    # ============================================
    RATE_LIMIT_ENABLED = os.getenv('RATE_LIMIT_ENABLED', 'false').lower() == 'true'
    RATE_LIMIT_REQUESTS = int(os.getenv('RATE_LIMIT_REQUESTS', 100))
    RATE_LIMIT_PERIOD = int(os.getenv('RATE_LIMIT_PERIOD', 3600))
    
    # ============================================
    # SESSION & CACHE
    # ============================================
    SESSION_TYPE = os.getenv('SESSION_TYPE', 'filesystem')
    SESSION_PERMANENT = os.getenv('SESSION_PERMANENT', 'false').lower() == 'true'
    SESSION_USE_SIGNER = os.getenv('SESSION_USE_SIGNER', 'true').lower() == 'true'
    SESSION_KEY_PREFIX = os.getenv('SESSION_KEY_PREFIX', 'blog_')
    SECRET_KEY = os.getenv('SECRET_KEY', os.getenv('JWT_SECRET_KEY', 'dev-secret-key'))
    
    REDIS_URL = os.getenv('REDIS_URL', 'redis://localhost:6379/0')
    USE_REDIS = os.getenv('USE_REDIS', 'false').lower() == 'true'
    
    # ============================================
    # VERIFICATION CODE SETTINGS
    # ============================================
    VERIFICATION_CODE_EXPIRY_HOURS = int(os.getenv('VERIFICATION_CODE_EXPIRY_HOURS', 24))
    VERIFICATION_CODE_LENGTH = int(os.getenv('VERIFICATION_CODE_LENGTH', 6))
    RESET_PASSWORD_EXPIRY_HOURS = int(os.getenv('RESET_PASSWORD_EXPIRY_HOURS', 1))
    
    # ============================================
    # LOGGING
    # ============================================
    LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO')
    LOG_FILE = os.getenv('LOG_FILE', 'blog_app.log')
    
    # ============================================
    # API CONFIGURATION
    # ============================================
    API_TITLE = os.getenv('API_TITLE', 'Modern SEO Blog API')
    API_VERSION = os.getenv('API_VERSION', '1.0.0')
    API_DESCRIPTION = os.getenv('API_DESCRIPTION', 'API untuk aplikasi blog modern dengan fitur lengkap SEO')
    API_PREFIX = os.getenv('API_PREFIX', '/api')
    
    # ============================================
    # BLOG SPECIFIC
    # ============================================
    POSTS_PER_PAGE = int(os.getenv('POSTS_PER_PAGE', 10))
    COMMENTS_PER_PAGE = int(os.getenv('COMMENTS_PER_PAGE', 20))
    FEATURED_POSTS_LIMIT = int(os.getenv('FEATURED_POSTS_LIMIT', 10))
    CACHE_POST_DURATION = int(os.getenv('CACHE_POST_DURATION', 300))
    
    DEFAULT_META_TITLE = os.getenv('DEFAULT_META_TITLE', 'Modern SEO Blog')
    DEFAULT_META_DESCRIPTION = os.getenv('DEFAULT_META_DESCRIPTION', 'Blog platform with SEO optimization')
    
    # ============================================
    # MAINTENANCE MODE
    # ============================================
    MAINTENANCE_MODE = os.getenv('MAINTENANCE_MODE', 'false').lower() == 'true'
    MAINTENANCE_MESSAGE = os.getenv('MAINTENANCE_MESSAGE', 'Server is under maintenance. Please try again later.')
    
    # ============================================
    # DEBUGGING
    # ============================================
    DEBUG_EMAIL = os.getenv('DEBUG_EMAIL', 'false').lower() == 'true'
    DEBUG_SQL = os.getenv('DEBUG_SQL', 'false').lower() == 'true'
    PROFILING_ENABLED = os.getenv('PROFILING_ENABLED', 'false').lower() == 'true'
    
    DEBUG = FLASK_DEBUG
    TESTING = False


class DevelopmentConfig(Config):
    """Development configuration"""
    DEBUG = True
    TESTING = False
    FLASK_ENV = 'development'
    FLASK_DEBUG = True
    
    SQLALCHEMY_ECHO = os.getenv('DEBUG_SQL', 'true').lower() == 'true'
    DEBUG_EMAIL = True
    PROFILING_ENABLED = False
    
    # Google OAuth untuk development
    GOOGLE_CLIENT_ID = os.getenv('GOOGLE_CLIENT_ID')
    GOOGLE_CLIENT_SECRET = os.getenv('GOOGLE_CLIENT_SECRET')
    GOOGLE_REDIRECT_URI = 'http://localhost:5000/api/auth/google/callback'
    
    SMTP_USE_SSL = False
    SMTP_USE_TLS = True
    SMTP_PORT = int(os.getenv('SMTP_PORT', 587))
    
    RATE_LIMIT_ENABLED = False
    CACHE_POST_DURATION = 0
    
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_size': 10,
        'pool_recycle': 3600,
        'pool_pre_ping': True,
        'pool_timeout': 60
    }


class ProductionConfig(Config):
    """Production configuration"""
    DEBUG = False
    TESTING = False
    FLASK_ENV = 'production'
    FLASK_DEBUG = False
    
    SQLALCHEMY_ECHO = False
    RATE_LIMIT_ENABLED = True
    SESSION_TYPE = 'redis'
    USE_REDIS = True
    
    BCRYPT_LOG_ROUNDS = 14
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(days=1)
    
    # Google OAuth untuk production
    GOOGLE_CLIENT_ID = os.getenv('GOOGLE_CLIENT_ID')
    GOOGLE_CLIENT_SECRET = os.getenv('GOOGLE_CLIENT_SECRET')
    GOOGLE_REDIRECT_URI = 'https://api.pipinipon.site/api/auth/google/callback'
    
    SMTP_USE_SSL = True
    SMTP_USE_TLS = False
    SMTP_PORT = 465
    
    LOG_LEVEL = 'WARNING'
    DEBUG_EMAIL = False
    DEBUG_SQL = False
    PROFILING_ENABLED = False
    
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_size': 20,
        'pool_recycle': 1800,
        'pool_pre_ping': True,
        'pool_timeout': 10
    }


class TestingConfig(Config):
    """Testing configuration"""
    TESTING = True
    DEBUG = True
    FLASK_ENV = 'testing'
    FLASK_DEBUG = True
    
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
    SQLALCHEMY_ECHO = False
    
    RATE_LIMIT_ENABLED = False
    
    # Google OAuth untuk testing
    GOOGLE_CLIENT_ID = 'test_client_id'
    GOOGLE_CLIENT_SECRET = 'test_client_secret'
    GOOGLE_REDIRECT_URI = 'http://localhost:5000/api/auth/google/callback'
    
    SMTP_USE_SSL = False
    SMTP_USE_TLS = False
    
    VERIFICATION_CODE_EXPIRY_HOURS = 1
    RESET_PASSWORD_EXPIRY_HOURS = 1
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=1)
    
    CACHE_POST_DURATION = 0
    DEBUG_EMAIL = True


config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'testing': TestingConfig,
    'default': DevelopmentConfig
}


def get_config():
    """Get configuration based on FLASK_ENV environment variable"""
    env = os.getenv('FLASK_ENV', 'development')
    config_class = config.get(env, DevelopmentConfig)
    
    if env == 'development':
        print("=" * 60)
        print(f"📋 Loaded Configuration: {env.upper()}")
        print("=" * 60)
        print(f"Database: {config_class.DB_NAME} @ {config_class.DB_HOST}:{config_class.DB_PORT}")
        print(f"User: {config_class.DB_USER}")
        print(f"API: {config_class.API_TITLE} v{config_class.API_VERSION}")
        print(f"Debug: {config_class.DEBUG}")
        print(f"Google OAuth: {'✓ Configured' if config_class.GOOGLE_CLIENT_ID else '✗ Not Configured'}")
        print(f"CORS Origins: {config_class.CORS_ORIGINS[:3]}..." if len(config_class.CORS_ORIGINS) > 3 else f"CORS Origins: {config_class.CORS_ORIGINS}")
        print("=" * 60)
    
    return config_class