import logging
from datetime import datetime

from django.core.management.base import BaseCommand
from django.db import transaction

from stiftung.models import Land, LandAbrechnung, Paechter, Verpachtung

logger = logging.getLogger(__name__)


class Command(BaseCommand):
    help = "Vereinheitlicht Verpachtungen, Land und Abrechnungen zu einem konsistenten System"

    def add_arguments(self, parser):
        parser.add_argument(
            "--dry-run",
            action="store_true",
            help="Zeigt nur an, was gemacht würde, ohne Änderungen zu speichern",
        )
        parser.add_argument(
            "--create-abrechnungen",
            action="store_true",
            help="Erstellt automatisch Abrechnungen aus Verpachtungsdaten",
        )

    def handle(self, *args, **options):
        dry_run = options["dry_run"]
        create_abrechnungen = options["create_abrechnungen"]

        if dry_run:
            self.stdout.write(
                self.style.WARNING("DRY RUN - Keine Änderungen werden gespeichert!")
            )

        # Schritt 1: Alle Verpachtungen analysieren
        alle_verpachtungen = Verpachtung.objects.all().order_by("land", "-pachtbeginn")
        self.stdout.write(
            f"Gefunden: {alle_verpachtungen.count()} Verpachtungen insgesamt"
        )

        land_updates = 0
        abrechnungen_created = 0

        with transaction.atomic():
            current_land = None

            for verpachtung in alle_verpachtungen:
                land = verpachtung.land

                # Für jedes Land nur die neueste aktive Verpachtung als "aktuell" setzen
                if current_land != land:
                    current_land = land

                    # Prüfen ob dies die neueste aktive Verpachtung ist
                    if verpachtung.status == "aktiv" and not land.aktueller_paechter:
                        self.stdout.write(
                            f"Setze aktuelle Verpachtung: {land} -> {verpachtung.paechter}"
                        )

                        if not dry_run:
                            # Land-Felder aktualisieren
                            land.aktueller_paechter = verpachtung.paechter
                            land.paechter_name = verpachtung.paechter.get_full_name()
                            land.paechter_anschrift = self._get_paechter_anschrift(
                                verpachtung.paechter
                            )
                            land.pachtbeginn = verpachtung.pachtbeginn
                            land.pachtende = verpachtung.pachtende
                            land.verlaengerung_klausel = bool(verpachtung.verlaengerung)
                            land.pachtzins_pauschal = verpachtung.pachtzins_jaehrlich

                            # Verpachtete Fläche synchronisieren
                            land.verp_flaeche_aktuell = verpachtung.verpachtete_flaeche

                            land.save()
                            land_updates += 1

                # Schritt 2: Abrechnungen aus Verpachtungen erstellen (optional)
                if create_abrechnungen and verpachtung.status == "aktiv":
                    # Erstelle Abrechnungen für die letzten 3 Jahre
                    current_year = datetime.now().year
                    for jahr in range(current_year - 2, current_year + 1):

                        # Prüfen ob Abrechnung bereits existiert
                        existing = LandAbrechnung.objects.filter(
                            land=land, abrechnungsjahr=jahr
                        ).first()

                        if not existing:
                            self.stdout.write(f"Erstelle Abrechnung: {land} - {jahr}")

                            if not dry_run:
                                abrechnung = LandAbrechnung.objects.create(
                                    land=land,
                                    abrechnungsjahr=jahr,
                                    pacht_vereinnahmt=verpachtung.pachtzins_jaehrlich,
                                    bemerkungen=f"Automatisch erstellt aus Verpachtung {verpachtung.vertragsnummer}",
                                )
                                abrechnungen_created += 1

        # Zusammenfassung
        self.stdout.write(self.style.SUCCESS("\n=== MIGRATION ABGESCHLOSSEN ==="))
        if dry_run:
            self.stdout.write(f"DRY RUN: {land_updates} Länder würden aktualisiert")
            if create_abrechnungen:
                self.stdout.write(
                    f"DRY RUN: {abrechnungen_created} Abrechnungen würden erstellt"
                )
        else:
            self.stdout.write(f"✓ {land_updates} Länder aktualisiert")
            if create_abrechnungen:
                self.stdout.write(f"✓ {abrechnungen_created} Abrechnungen erstellt")

        # Empfehlungen
        self.stdout.write(self.style.WARNING("\n=== NÄCHSTE SCHRITTE ==="))
        self.stdout.write("1. Prüfen Sie die migrierten Daten in der Weboberfläche")
        self.stdout.write(
            '2. Alte Verpachtungs-Views können als "Legacy" markiert werden'
        )
        self.stdout.write(
            "3. Neue Verpachtungen sollten direkt im Land-Model erstellt werden"
        )

    def _get_paechter_anschrift(self, paechter):
        """Erstellt eine Anschrift aus den Pächter-Daten"""
        parts = []
        if paechter.strasse:
            parts.append(paechter.strasse)
        if paechter.plz and paechter.ort:
            parts.append(f"{paechter.plz} {paechter.ort}")
        elif paechter.ort:
            parts.append(paechter.ort)

        return "\n".join(parts) if parts else ""
