"""Application settings from environment and admin config."""
import os
from pathlib import Path
from dotenv import load_dotenv
from app.config.config_storage import get_config_storage
from integrations.client_context import get_current_client
from integrations.models import ClientBranch

_ROOT = Path(__file__).resolve().parent.parent.parent
_env = _ROOT / ".env"
if _env.exists():
    load_dotenv(_env)
else:
    load_dotenv()

class Settings:
    """Application settings loaded from environment variables."""
    
    # Database
    DATABASE_URL: str = os.getenv("DATABASE_URL", "sqlite:///./data/invoices.db")
    
    # Sync interval
    SYNC_INTERVAL_SECONDS: int = int(os.getenv("SYNC_INTERVAL_SECONDS", "60"))
    
    # Branch 1 (Busselton)
    SIMPRO_BRANCH1_API_KEY: str = os.getenv("SIMPRO_BRANCH1_API_KEY", "")
    SIMPRO_BRANCH1_API_URL: str = os.getenv("SIMPRO_BRANCH1_API_URL", "https://nixonbusselton.simprosuite.com/api/v1.0")
    
    # Branch 2 (Bunbury)
    SIMPRO_BRANCH2_API_KEY: str = os.getenv("SIMPRO_BRANCH2_API_KEY", "")
    SIMPRO_BRANCH2_API_URL: str = os.getenv("SIMPRO_BRANCH2_API_URL", "https://nixonelectrics.simprosuite.com/api/v1.0")
    
    # Branch 3 (Mandurah)
    SIMPRO_BRANCH3_API_KEY: str = os.getenv("SIMPRO_BRANCH3_API_KEY", "")
    SIMPRO_BRANCH3_API_URL: str = os.getenv("SIMPRO_BRANCH3_API_URL", "https://nixonmandurah.simprosuite.com/api/v1.0")
    
    # Branch configurations (defaults - can be overridden by admin config)
    _BRANCHES_DEFAULT = {
        "branch1": {
            "id": "branch1",
            "name": "Busselton",
            "api_key": SIMPRO_BRANCH1_API_KEY,
            "api_url": SIMPRO_BRANCH1_API_URL,
            "companies": {
                139: {"name": "Electrical", "breakeven": 90000, "target": 100000},
                172: {"name": "Air", "breakeven": 85000, "target": 120000}
            }
        },
        "branch2": {
            "id": "branch2",
            "name": "Bunbury",
            "api_key": SIMPRO_BRANCH2_API_KEY,
            "api_url": SIMPRO_BRANCH2_API_URL,
            "companies": {
                2: {"name": "Residential", "breakeven": 154102, "target": 180000},
                3: {"name": "Air", "breakeven": 222592, "target": 260000},
                4: {"name": "Solar", "breakeven": 179786, "target": 210000},
                5: {"name": "Commercial", "breakeven": 282520, "target": 330000}
            }
        },
        "branch3": {
            "id": "branch3",
            "name": "Mandurah",
            "api_key": SIMPRO_BRANCH3_API_KEY,
            "api_url": SIMPRO_BRANCH3_API_URL,
            "companies": {
                2: {"name": "Electrical", "breakeven": 190000, "target": 250000},
                35: {"name": "Air", "breakeven": 110000, "target": 150000}
            }
        }
    }
    
    @property
    def BRANCHES(self):
        """
        Get branch configurations, merging defaults with admin-managed overrides.
        Returns a merged configuration where admin updates take precedence.
        """
        import copy
        branches = copy.deepcopy(self._BRANCHES_DEFAULT)
        
        # Load client-scoped integration overrides (if configured in Django DB)
        try:
            client = get_current_client()
            if client:
                for row in ClientBranch.objects.filter(client=client):
                    if row.branch_id in branches:
                        if row.simpro_api_key:
                            branches[row.branch_id]["api_key"] = row.simpro_api_key
                        if row.simpro_api_url:
                            branches[row.branch_id]["api_url"] = row.simpro_api_url
                        if row.branch_name:
                            branches[row.branch_id]["name"] = row.branch_name
        except Exception:
            # Keep legacy env defaults if DB-backed integration config unavailable
            pass

        # Load admin-managed targets/breakevens
        try:
            storage = get_config_storage()
            admin_config = storage.get_targets_breakevens()
            
            # Apply admin overrides
            for key, values in admin_config.items():
                if "_" in key:
                    branch_id, company_id_str = key.split("_", 1)
                    try:
                        company_id = int(company_id_str)
                        if branch_id in branches and company_id in branches[branch_id]["companies"]:
                            if "target" in values:
                                branches[branch_id]["companies"][company_id]["target"] = values["target"]
                            if "breakeven" in values:
                                branches[branch_id]["companies"][company_id]["breakeven"] = values["breakeven"]
                    except (ValueError, KeyError):
                        pass  # Skip invalid entries
        except Exception as e:
            # If config storage fails, use defaults
            import logging
            logging.getLogger(__name__).warning(f"Could not load admin config: {e}. Using defaults.")
        
        return branches

settings = Settings()

