package de.assecutor.votianlt.config;

import de.assecutor.votianlt.model.invoices.CustomerInvoice;
import de.assecutor.votianlt.model.invoices.InvoiceAuditAction;
import de.assecutor.votianlt.model.invoices.InvoiceAuditEntry;
import de.assecutor.votianlt.model.invoices.InvoiceStatus;
import de.assecutor.votianlt.model.invoices.InvoiceType;
import de.assecutor.votianlt.repository.CustomerInvoiceRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

/**
 * Einmalige Migration der vorhandenen Rechnungen auf das neue Lifecycle-Modell.
 *
 * Bestandsdaten haben weder Status noch Typ. Sie werden konservativ auf
 * <code>type=INVOICE, status=ISSUED</code> gesetzt – sie sind in der Praxis bereits
 * ausgestellt, denn sie tragen eine Rechnungsnummer und enthalten ein PDF.
 *
 * Ein Audit-Eintrag dokumentiert die Migration (R-37).
 */
@Component
@Order(50)
public class InvoiceLifecycleMigration implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(InvoiceLifecycleMigration.class);

    private final CustomerInvoiceRepository invoiceRepository;

    public InvoiceLifecycleMigration(CustomerInvoiceRepository invoiceRepository) {
        this.invoiceRepository = invoiceRepository;
    }

    @Override
    public void run(String... args) {
        List<CustomerInvoice> legacyInvoices = invoiceRepository.findByStatusIsNull();
        if (legacyInvoices.isEmpty()) {
            return;
        }
        LocalDateTime now = LocalDateTime.now();
        for (CustomerInvoice invoice : legacyInvoices) {
            invoice.setType(InvoiceType.INVOICE);
            invoice.setStatus(InvoiceStatus.ISSUED);
            if (invoice.getIssuedAt() == null) {
                invoice.setIssuedAt(now);
            }
            InvoiceAuditEntry entry = new InvoiceAuditEntry(InvoiceAuditAction.ISSUED, null, "system",
                    "Migration: Bestandsrechnung auf Status ISSUED gesetzt.");
            invoice.addAuditEntry(entry);
        }
        invoiceRepository.saveAll(legacyInvoices);
        log.info("Lifecycle-Migration: {} Bestandsrechnungen auf Status ISSUED gesetzt.", legacyInvoices.size());
    }
}
