# app/services/scheduler.py

import datetime
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from .utils import generate_interventions_for_client, MONGODB_DATABASE, mongodb_connect, process_interventions_by_period

mongodb_client = mongodb_connect()

scheduler = AsyncIOScheduler()

async def daily_task():
    clients = list(mongodb_client[MONGODB_DATABASE]["clients"].find())
    
    for client in clients:
        pools = list(mongodb_client[MONGODB_DATABASE]["pools"].find({'client_sub': client['sub']}))
        for pool in pools:
            existing_interventions = list(mongodb_client[MONGODB_DATABASE]["interventions"].find({'pool_sub': pool['sub']}))        
            new_interventions = generate_interventions_for_client(client, pool, existing_interventions)
            if new_interventions:
                mongodb_client[MONGODB_DATABASE]["interventions"].insert_many(new_interventions)

def start_scheduler():
    # scheduler.add_job(daily_task, 'interval', seconds=5)
    scheduler.add_job(daily_task, 'cron', hour=0, minute=0)  # Run daily at midnight
    scheduler.start()

async def stop_scheduler():
    scheduler.shutdown()

async def regenerate_interventions_for_client(client_sub):
    client = mongodb_client[MONGODB_DATABASE]["clients"].find_one({'sub': client_sub})
    pools = list(mongodb_client[MONGODB_DATABASE]["pools"].find({'client_sub': client_sub}))
    for pool in pools:
        # Get all existing interventions for this pool
        existing_interventions = list(mongodb_client[MONGODB_DATABASE]["interventions"].find({'pool_sub': pool['sub']}))

        # Generate new interventions
        new_interventions = generate_interventions_for_client(client, pool, existing_interventions)

        # Process interventions by period (month, week, day)
        current_year = datetime.date.today().year
        for month_info in client['maintenance_info']['frequency']:
            interventions_to_remove = process_interventions_by_period(existing_interventions, month_info, current_year)

            # Remove interventions that are no longer needed
            if interventions_to_remove:
                intervention_subs_to_remove = [i['sub'] for i in interventions_to_remove]
                mongodb_client[MONGODB_DATABASE]["interventions"].delete_many({
                    'sub': {'$in': intervention_subs_to_remove},
                    'pool_sub': pool['sub']
                })

        # Add new interventions
        if new_interventions:
            mongodb_client[MONGODB_DATABASE]["interventions"].insert_many(new_interventions)