# config.py
# config.py

import os
from datetime import timedelta

class Config:
    # ============================================
    # کلید مخفی برای CSRF و Session
    # ============================================
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'your-secret-key-here-change-in-production'
    
    # ============================================
    # تنظیمات دیتابیس
    # ============================================
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///app.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ECHO = False  # برای دیباگ، True کنید تا کوئری‌ها نمایش داده شوند
    
    # ============================================
    # تنظیمات آپلود
    # ============================================
    UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static', 'uploads')
    UPLOAD_FOLDER_ADS = os.path.join(UPLOAD_FOLDER, 'advertisements')
    MAX_CONTENT_LENGTH = 16 * 1024 * 1024  # 16MB
    ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'pdf', 'doc', 'docx'}
    
    # ============================================
    # تنظیمات CSRF
    # ============================================
    WTF_CSRF_ENABLED = True
    WTF_CSRF_SECRET_KEY = SECRET_KEY
    WTF_CSRF_TIME_LIMIT = 3600  # یک ساعت
    
    # ============================================
    # ✅ تنظیمات Session (مهم برای حل مشکل لاگین)
    # ============================================
    PERMANENT_SESSION_LIFETIME = timedelta(days=7)  # مدت زمان ماندگاری session
    SESSION_COOKIE_SECURE = False  # در تولید (HTTPS) True کنید
    SESSION_COOKIE_HTTPONLY = True
    SESSION_COOKIE_SAMESITE = 'Lax'  # یا 'Strict' برای امنیت بیشتر
    SESSION_REFRESH_EACH_REQUEST = True  # تمدید session با هر درخواست
    SESSION_COOKIE_DOMAIN = None  # در تولید نام دامنه را وارد کنید
    
    # ============================================
    # ✅ تنظیمات Remember Me Cookie (مهم)
    # ============================================
    REMEMBER_COOKIE_DURATION = timedelta(days=30)  # مدت زمان ماندگاری "مرا به خاطر بسپار"
    REMEMBER_COOKIE_HTTPONLY = True
    REMEMBER_COOKIE_SAMESITE = 'Lax'
    REMEMBER_COOKIE_SECURE = False  # در تولید (HTTPS) True کنید
    
    # ============================================
    # تنظیمات ایمیل (اختیاری)
    # ============================================
    MAIL_SERVER = os.environ.get('MAIL_SERVER', 'smtp.gmail.com')
    MAIL_PORT = int(os.environ.get('MAIL_PORT', 587))
    MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', True)
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    
    # ============================================
    # تنظیمات پیامک (برای ارسال رمز موقت)
    # ============================================
    SMS_ENABLED = False  # در تولید True کنید
    SMS_SERVICE = 'kavenegar'  # kavenegar, smsir, twilio
    KAVENEGAR_API_KEY = os.environ.get('KAVENEGAR_API_KEY', '')
    SMS_SENDER_NUMBER = os.environ.get('SMS_SENDER_NUMBER', '1000596446')
    
    # ============================================
    # تنظیمات برنامه
    # ============================================
    APP_NAME = 'نیوگاه - سامانه مدیریت پروژه'
    GPS_DEFAULT_RADIUS = 100  # متر
    
    # ============================================
    # تنظیمات Flask-Login (مهم)
    # ============================================
    LOGIN_MESSAGE = 'لطفاً برای دسترسی به این صفحه وارد شوید.'
    LOGIN_MESSAGE_CATEGORY = 'warning'
    LOGIN_VIEW = 'auth.login'  # نام endpoint برای صفحه ورود
    
    # ============================================
    # تنظیمات دیباگ و توسعه
    # ============================================
    DEBUG = os.environ.get('FLASK_DEBUG', 'False').lower() == 'true'
    TESTING = os.environ.get('FLASK_TESTING', 'False').lower() == 'true'
    
    # ============================================
    # تنظیمات امنیتی
    # ============================================
    # در تولید، این موارد را فعال کنید
    if os.environ.get('FLASK_ENV') == 'production':
        SESSION_COOKIE_SECURE = True
        REMEMBER_COOKIE_SECURE = True
        SESSION_COOKIE_SAMESITE = 'Strict'
        REMEMBER_COOKIE_SAMESITE = 'Strict'
        WTF_CSRF_ENABLED = True
        
    # ============================================
    # تنظیمات CORS (در صورت نیاز)
    # ============================================
    CORS_ORIGINS = os.environ.get('CORS_ORIGINS', '*').split(',')







class DevelopmentConfig(Config):
    """تنظیمات محیط توسعه"""
    DEBUG = True
    SQLALCHEMY_ECHO = True
    SESSION_COOKIE_SECURE = False
    REMEMBER_COOKIE_SECURE = False
    SMS_ENABLED = False
    
    # ✅ SECRET_KEY پیش‌فرض برای توسعه
    SECRET_KEY = 'dev-secret-key-12345-change-in-production'


class ProductionConfig(Config):
    """تنظیمات محیط تولید"""
    DEBUG = False
    SQLALCHEMY_ECHO = False
    SESSION_COOKIE_SECURE = True
    REMEMBER_COOKIE_SECURE = True
    SESSION_COOKIE_SAMESITE = 'Strict'
    REMEMBER_COOKIE_SAMESITE = 'Strict'
    SMS_ENABLED = True
    
    # ✅ دریافت SECRET_KEY از محیط
    SECRET_KEY = os.environ.get('SECRET_KEY')
    
    # ✅ اگر SECRET_KEY وجود نداشت، یک استثنا پرتاب کن
    @property
    def SECRET_KEY(self):
        key = os.environ.get('SECRET_KEY')
        if not key:
            raise ValueError("SECRET_KEY must be set in production!")
        return key


class TestingConfig(Config):
    """تنظیمات محیط تست"""
    TESTING = True
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
    SESSION_COOKIE_SECURE = False
    REMEMBER_COOKIE_SECURE = False
    WTF_CSRF_ENABLED = False
    SMS_ENABLED = False
    SECRET_KEY = 'test-secret-key'


# انتخاب پیکربندی بر اساس محیط
config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'testing': TestingConfig,
    'default': DevelopmentConfig
}


def get_config():
    """دریافت پیکربندی مناسب بر اساس محیط"""
    env = os.environ.get('FLASK_ENV', 'development')
    
    # اگر محیط production باشد اما SECRET_KEY تنظیم نشده، به development برگرد
    if env == 'production' and not os.environ.get('SECRET_KEY'):
        print("⚠️ 警告: SECRET_KEY در محیط production تنظیم نشده است! استفاده از محیط development...")
        return DevelopmentConfig
    
    return config.get(env, DevelopmentConfig)