import sys
import os
import asyncio
import logging
from datetime import datetime

# Add the project root to sys.path to allow importing app modules
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from app.services.infra.database import get_eligible_tenants
from app.services.chat.analytics import get_kpis

# Setup logging for the cron job
LOG_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logs")
os.makedirs(LOG_DIR, exist_ok=True)
LOG_FILE = os.path.join(LOG_DIR, "analytics_refresh.log")

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler(LOG_FILE),
        logging.StreamHandler(sys.stdout)
    ]
)
logger = logging.getLogger("cron_analytics")

async def run_refresh():
    logger.info("--- Starting Scheduled Analytics Refresh ---")
    start_time = datetime.now()
    
    try:
        tenants = get_eligible_tenants()
        if not tenants:
            logger.info("No eligible tenants found for refresh.")
            return

        logger.info(f"Processing {len(tenants)} tenants sequentially...")
        
        for tenant_id in tenants:
            logger.info(f"Refreshing analytics for tenant: {tenant_id}")
            try:
                # get_kpis orchestrates thread discovery, AI analysis, and dbt runs
                result = await get_kpis(tenant_id)
                if result.get("status") in ["success", "partial_success"]:
                    logger.info(f"Successfully refreshed tenant: {tenant_id}")
                else:
                    logger.error(f"Failed to refresh tenant: {tenant_id}. Result: {result}")
            except Exception as e:
                logger.error(f"Unexpected error refreshing tenant {tenant_id}: {e}", exc_info=True)
            
            # Small delay between tenants to prevent spiking resources
            await asyncio.sleep(2)

    except Exception as e:
        logger.critical(f"Critical error in cron script: {e}", exc_info=True)
    
    end_time = datetime.now()
    duration = end_time - start_time
    logger.info(f"--- Analytics Refresh Completed in {duration} ---")

if __name__ == "__main__":
    asyncio.run(run_refresh())
