"""Generate slots only for verified, active clinicians with approved schedules."""
from datetime import datetime, timedelta
from django.conf import settings
from django.core.cache import cache
from django.utils import timezone
from .models import TelehealthAvailabilitySlot, TelehealthProvider

def ensure_consultation_slots(days=30):
    if not getattr(settings, 'TELEHEALTH_AUTO_SLOTS_ENABLED', True):
        return 0
    days = max(1,min(int(days),30))
    today = timezone.localdate()
    providers = list(TelehealthProvider.objects.filter(is_active=True,is_verified=True,auto_schedule=True))
    created = 0
    now = timezone.now()
    tz = timezone.get_current_timezone()
    for provider in providers:
        schedule_key = '{}:{}:{}:{}:{}:{}:{}'.format(provider.pk,provider.working_days,provider.work_start,provider.work_end,provider.slot_minutes,provider.is_verified,provider.updated_at)
        key = 'ths_v52_slots_{}_{}_{}'.format(today.isoformat(),days,schedule_key)
        if not cache.add(key,'working',timeout=120):
            continue
        try:
            weekdays = {int(x.strip()) for x in provider.working_days.split(',') if x.strip()}
            if not weekdays.issubset(set(range(7))) or provider.slot_minutes <= 0 or provider.work_start >= provider.work_end:
                continue
            for offset in range(days):
                day = today + timedelta(days=offset)
                if day.weekday() not in weekdays:
                    continue
                cursor = datetime.combine(day,provider.work_start)
                end = datetime.combine(day,provider.work_end)
                while cursor + timedelta(minutes=provider.slot_minutes) <= end:
                    start = timezone.make_aware(cursor,tz)
                    if start > now + timedelta(hours=1):
                        # Do not recreate intentionally disabled or booked slots.
                        if not TelehealthAvailabilitySlot.objects.filter(provider=provider,start_at=start).exists():
                            _, made = TelehealthAvailabilitySlot.objects.get_or_create(
                                provider=provider,start_at=start,
                                defaults={'end_at':start+timedelta(minutes=provider.slot_minutes),'capacity':1,'is_active':True})
                            created += int(made)
                    cursor += timedelta(minutes=provider.slot_minutes)
            cache.set(key,'done',timeout=600)
        except Exception:
            cache.delete(key)
            raise
    return created
