import os
from dotenv import load_dotenv
from typing import List, Optional

# Load environment variables from .env file
load_dotenv()

def _get_env_suffix():
    vm_project = os.getenv('VM_PROJECT')
    if not vm_project:
        return ''
    
    # Extract suffix if project name contains a dash followed by a number
    if '-' in vm_project:
        project_suffix = vm_project.split('-')[-1]
        if project_suffix in ['1', '5', '4', '7']:
            return f'_{project_suffix}'
    return ''

def _get_stripe_env():
    vm_project = os.getenv('VM_PROJECT')
    if not vm_project:
        return '_TEST'
    
    # Extract suffix if project name contains a dash followed by a number
    if '-' in vm_project:
        project_suffix = vm_project.split('-')[-1]
        if project_suffix == '1':
            return '_LIVE'
    return '_TEST'

def _get_env(base_name: str, stripe: bool = False) -> Optional[str]:
    if stripe:
        # For Stripe variables, use _LIVE or _TEST based on project name
        suffix = _get_stripe_env()
        return os.getenv(f'{base_name}{suffix}')
    else:
        # For regular variables, use dynamic suffix based on project name
        suffix = _get_env_suffix()
        if suffix:
            # Try with suffix first, then fallback to base name
            value = os.getenv(f'{base_name}{suffix}')
            return value if value is not None else os.getenv(base_name)
        else:
            # If no suffix, use base name
            return os.getenv(base_name)

class Config:
    """Configuration manager for the application"""
    
    # API Keys
    OPENAI_API_KEY = _get_env('OPENAI_API_KEY')
    PINECONE_API_KEY = _get_env('PINECONE_API_KEY')
    TOGETHERAI_API_KEY = _get_env('TOGETHERAI_API_KEY')
    FIREBASE_API_KEY = _get_env('FIREBASE_API_KEY')
    
    # Credentials
    NATIONAL_DATASET_KEY = _get_env('NATIONAL_DATASET_KEY')
    GCP_LLM_KEY = _get_env('GCP_LLM_KEY')
    FIRESTORE_KEY = _get_env('FIRESTORE_KEY')
    
    # ZILLIZ Configuration
    ZILLIZ_ENDPOINT = _get_env('ZILLIZ_ENDPOINT')
    ZILLIZ_TOKEN = _get_env('ZILLIZ_TOKEN')
    ZILLIZ_INSTANCE_NAME = _get_env('ZILLIZ_INSTANCE_NAME')
    ZILLIZ_PUBMED_COLLECTION = _get_env('ZILLIZ_PUBMED_COLLECTION')
    ZILLIZ_DOC_COLLECTION = _get_env('ZILLIZ_DOC_COLLECTION')
    ZILLIZ_SQL_COLLECTION = _get_env('ZILLIZ_SQL_COLLECTION')
    
    # Project Configuration
    MODEL_NAME = os.getenv('MODEL_NAME', 'gemini-2.0-flash-001')
    MAIN_CLIENT = os.getenv('MAIN_CLIENT', 'false').lower() == 'true'
    ALLOWED_EMAILS = os.getenv('ALLOWED_EMAILS', '').split(',') if os.getenv('ALLOWED_EMAILS') else []
    ENDPOINT_ID = _get_env('ENDPOINT_ID')
    GCP_PROJECT = _get_env('GCP_PROJECT')
    GCP_PROJECT_UNDERSCORE = GCP_PROJECT.replace('-', '_') if GCP_PROJECT else None
    VM_PROJECT = _get_env('VM_PROJECT')
    BQ_DATASET = _get_env('BQ_DATASET')
    ELABORATE_REPORT_COHORT_DATASET = _get_env('ELABORATE_REPORT_COHORT_DATASET')
    DIAGNOSIS_ICD10_DESC_TABLE = _get_env('DIAGNOSIS_ICD10_DESC_TABLE')
    DISEASE_GROUPS_TABLE = _get_env('DISEASE_GROUPS_TABLE')
    
    # Stripe Configuration
    STRIPE_RETURN_URL = _get_env('STRIPE_RETURN_URL')
    STRIPE_CLOUD_DNS_NAME = _get_env('STRIPE_CLOUD_DNS_NAME')
    STRIPE_SECRET_KEY = _get_env('STRIPE_SECRET_KEY', stripe=True)
    STRIPE_PUBLISHABLE_KEY = _get_env('STRIPE_PUBLISHABLE_KEY', stripe=True)
    STRIPE_PRICING_TABLE_ID = _get_env('STRIPE_PRICING_TABLE_ID', stripe=True)
    STRIPE_BILLING_PORTAL_CONFIGURATION_ID = _get_env('STRIPE_BILLING_PORTAL_CONFIGURATION_ID')
    STRIPE_PRICING_PAGE_FILENAME = os.getenv('STRIPE_PRICING_PAGE_FILENAME', 'subscription_pricing.html')
    
    # Stripe Subscription Products
    STRIPE_SUBSCRIPTION_PRODUCT_1 = _get_env('STRIPE_SUBSCRIPTION_PRODUCT_1', stripe=True)
    STRIPE_SUBSCRIPTION_PRICES_1 = _get_env('STRIPE_SUBSCRIPTION_PRICES_1', stripe=True).split(',') if _get_env('STRIPE_SUBSCRIPTION_PRICES_1', stripe=True) else []
    STRIPE_SUBSCRIPTION_PRODUCT_2 = _get_env('STRIPE_SUBSCRIPTION_PRODUCT_2', stripe=True)
    STRIPE_SUBSCRIPTION_PRICES_2 = _get_env('STRIPE_SUBSCRIPTION_PRICES_2', stripe=True).split(',') if _get_env('STRIPE_SUBSCRIPTION_PRICES_2', stripe=True) else []

    @classmethod
    def get_zilliz_config(cls) -> dict:
        """Get ZILLIZ configuration as a dictionary"""
        return {
            'zilliz_endpoint': cls.ZILLIZ_ENDPOINT,
            'zilliz_token': cls.ZILLIZ_TOKEN,
            'zilliz_instance_name': cls.ZILLIZ_INSTANCE_NAME,
            'zilliz_pubmed_collection': cls.ZILLIZ_PUBMED_COLLECTION,
            'zilliz_doc_collection': cls.ZILLIZ_DOC_COLLECTION,
            'zilliz_sql_collection': cls.ZILLIZ_SQL_COLLECTION
        }
    
    @classmethod
    def get_api_config(cls) -> dict:
        """Get API configuration as a dictionary"""
        return {
            'OPENAI_API_KEY': cls.OPENAI_API_KEY,
            'PINECONE_API_KEY': cls.PINECONE_API_KEY,
            'TOGETHERAI_API_KEY': cls.TOGETHERAI_API_KEY,
            'FIREBASE_API_KEY': cls.FIREBASE_API_KEY
        }
    
    @classmethod
    def get_credentials_config(cls) -> dict:
        """Get credentials configuration as a dictionary"""
        return {
            'national_dataset_key': cls.NATIONAL_DATASET_KEY,
            'gcp_llm_key': cls.GCP_LLM_KEY,
            'firestore_key': cls.FIRESTORE_KEY
        }
    
    @classmethod
    def get_project_config(cls) -> dict:
        """Get project configuration as a dictionary"""
        return {
            'model_name': cls.MODEL_NAME,
            'main_client': cls.MAIN_CLIENT,
            'allowed_emails': cls.ALLOWED_EMAILS,
            'endpoint_id': cls.ENDPOINT_ID,
            'gcp_project': cls.GCP_PROJECT,
            'gcp_project_underscore': cls.GCP_PROJECT_UNDERSCORE,
            'vm_project': cls.VM_PROJECT,
            'bq_dataset': cls.BQ_DATASET,
            'elaborate_report_cohort_dataset': cls.ELABORATE_REPORT_COHORT_DATASET,
            'diagnosis_icd10_desc_table': cls.DIAGNOSIS_ICD10_DESC_TABLE
        }
    
    @classmethod
    def get_stripe_config(cls) -> dict:
        """Get Stripe configuration as a dictionary"""
        return {
            'return_url': cls.STRIPE_RETURN_URL,
            'cloud_dns_name': cls.STRIPE_CLOUD_DNS_NAME,
            'secret_key': cls.STRIPE_SECRET_KEY,
            'publishable_key': cls.STRIPE_PUBLISHABLE_KEY,
            'pricing_table_id': cls.STRIPE_PRICING_TABLE_ID,
            'billing_portal_configuration_id': cls.STRIPE_BILLING_PORTAL_CONFIGURATION_ID,
            'pricing_page_filename': cls.STRIPE_PRICING_PAGE_FILENAME
        }
    
    @classmethod
    def get_stripe_subscription_products(cls) -> List[dict]:
        """Get Stripe subscription products configuration"""
        products = []
        if cls.STRIPE_SUBSCRIPTION_PRODUCT_1 and cls.STRIPE_SUBSCRIPTION_PRICES_1:
            products.append({
                'product': cls.STRIPE_SUBSCRIPTION_PRODUCT_1,
                'prices': cls.STRIPE_SUBSCRIPTION_PRICES_1
            })
        if cls.STRIPE_SUBSCRIPTION_PRODUCT_2 and cls.STRIPE_SUBSCRIPTION_PRICES_2:
            products.append({
                'product': cls.STRIPE_SUBSCRIPTION_PRODUCT_2,
                'prices': cls.STRIPE_SUBSCRIPTION_PRICES_2
            })
        return products

# Create a global config instance
config = Config()

# print(config.FIREBASE_API_KEY)