
from datetime import date, timedelta
from django.core.management.base import BaseCommand
from django.db import transaction
from django.db.models import Q
from management.models.plan_archivio import PlanArchivio
from management.models.stato_pratica import StatoPratica

class Command(BaseCommand):
    help = "Sposta alla settimana successiva le pratiche non chiuse"
    def add_arguments(self, parser):
        parser.add_argument(
            "--dry-run",
            action="store_true",
            help="Non salva le modifiche"
        )

    def handle(self, *args, **kwargs):
        dry_run = kwargs.get("dry_run")

        pratiche = (
            PlanArchivio.objects
            .filter(
                ~Q(stato_pratica__codice__in=["chi", "no_lav"])
            )
        )

        aggiornate = 0
        pratiche_aggiornate = []
        with transaction.atomic():
            oggi = date.today()

            for pratica in pratiche:

                anno = pratica.anno_di_lavorazione
                mese = pratica.mese_di_lavorazione
                settimana = pratica.settimana_di_lavorazione

                if not anno or not mese or not settimana:
                    continue

                data_inizio = self.data_inizio_settimana(
                    anno,
                    mese,
                    settimana
                )
                fine_settimana = data_inizio + timedelta(days=5)
                if fine_settimana > oggi:
                    continue

                settimane_mese = self.numero_settimane_mese(
                    anno,
                    mese
                )

                if settimana < settimane_mese:
                    pratica.settimana_di_lavorazione += 1

                else:
                    # cambio mese
                    if mese == 12:
                        pratica.anno_di_lavorazione += 1
                        pratica.mese_di_lavorazione = 1
                    else:
                        pratica.mese_di_lavorazione += 1

                    pratica.settimana_di_lavorazione = 1
                if not dry_run:
                    pratica.save(
                        update_fields=[
                            "anno_di_lavorazione",
                            "mese_di_lavorazione",
                            "settimana_di_lavorazione",
                        ]
                    )

                aggiornate += 1
                pratiche_aggiornate.append(pratica)
        self.stdout.write(
            self.style.SUCCESS(
                f"Aggiornate {aggiornate} pratiche: {[p.id for p in pratiche_aggiornate]}"
            )
        )

    def primo_lunedi(self, anno, mese):
        d = date(anno, mese, 1)

        while d.weekday() != 0:  # 0 = lunedì
            d += timedelta(days=1)

        return d


    def numero_settimane_mese(self, anno, mese):
        lunedi = self.primo_lunedi(anno, mese)

        count = 0
        while lunedi.month == mese:
            count += 1
            lunedi += timedelta(days=7)

        return count

    def data_inizio_settimana(self, anno, mese, settimana):
        primo_lunedi = self.primo_lunedi(anno, mese)
        return primo_lunedi + timedelta(days=(settimana - 1) * 7)