package de.assecutor.votianlt.pages.view;

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.html.*;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.select.Select;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.value.ValueChangeMode;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import de.assecutor.votianlt.pages.base.ui.component.ViewToolbar;
import de.assecutor.votianlt.pages.base.ui.view.MainLayout;
import jakarta.annotation.security.RolesAllowed;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * Meine Rechnungen – nutzerzentrierte Übersicht.
 *
 * Layout orientiert am bereitgestellten Screenshot: - Zwei Karten oben (Offene
 * Rechnungen, Bankverbindung) - Darunter ein Bereich „Rechnungen" mit Grid,
 * Suche und Seitengröße
 */
@PageTitle("Meine Rechnungen")
@Route(value = "my-invoices", layout = MainLayout.class)
@RolesAllowed("USER")
public class MyInvoicesView extends Main {

    private final Grid<MyInvoiceRow> grid = new Grid<>(MyInvoiceRow.class, false);
    private final List<MyInvoiceRow> allRows = new ArrayList<>(); // zunächst leer

    public MyInvoicesView() {
        getStyle().set("max-width", "90%");
        getStyle().set("margin-left", "auto");
        getStyle().set("margin-right", "auto");

        // Toolbar / Titel
        add(new ViewToolbar("Meine Rechnungen"));

        // Kartenbereich oben
        add(createTopCards());

        // Rechnungsbereich unten
        add(createInvoicesSection());
    }

    private Component createTopCards() {
        // Container mit zwei Spalten (responsiv)
        Div container = new Div();
        container.getStyle().set("display", "grid").set("grid-template-columns", "48% 2% 48%");
        // .set("gap", "10px");
        // Spaltenabstände: 2% zwischen den beiden Spalten
        container.getStyle().set("column-gap", "0");

        // Karte: Offene Rechnungen
        Paragraph hint = new Paragraph("Momentan sind keine neuen Rechnungen für Sie im System gespeichert.");
        hint.getStyle().set("color", "var(--lumo-success-text-color)");
        Div openInvoicesCard = createCard("Offene Rechnungen", hint);

        // Karte: Bankverbindung
        VerticalLayout bankData = new VerticalLayout();
        bankData.setPadding(false);
        bankData.setSpacing(false);
        bankData.add(labeledValue("Kreditinstitut", "Hamburger Sparkasse"),
                labeledValue("Begünstigter", "Assecutor Data Service GmbH"),
                labeledValue("IBAN", "DE67200505501217139888"), labeledValue("Verwendungszweck", "vlt-00000610"));
        Div bankCard = createCard("Bankverbindung", bankData);

        container.add(openInvoicesCard, bankCard);
        return container;
    }

    private Component createInvoicesSection() {
        Div card = new Div();
        // Abstand zur oberen Zeile
        card.getStyle().set("margin-top", "30px");

        styleCard(card);

        // Kopfzeile
        H3 title = new H3("Rechnungen");
        title.getStyle().set("margin", "0");

        // Steuerleiste: Seitengröße + Suche
        Select<Integer> pageSize = new Select<>();
        pageSize.setItems(10, 25, 50);
        pageSize.setLabel("Einträge anzeigen");
        pageSize.setValue(10);
        pageSize.setWidth("140px");

        TextField search = new TextField();
        search.setLabel("Suchen");
        search.setClearButtonVisible(true);
        search.setValueChangeMode(ValueChangeMode.EAGER);

        // Layout Kopf + Controls
        HorizontalLayout header = new HorizontalLayout();
        header.setWidthFull();
        header.setDefaultVerticalComponentAlignment(FlexComponent.Alignment.END);
        header.setJustifyContentMode(FlexComponent.JustifyContentMode.BETWEEN);
        header.add(title, new Div()); // Platzhalter zum Strecken

        HorizontalLayout controls = new HorizontalLayout(pageSize, search);
        controls.setWidthFull();
        controls.setJustifyContentMode(FlexComponent.JustifyContentMode.BETWEEN);

        // Grid konfigurieren
        grid.addColumn(MyInvoiceRow::status).setHeader("Status").setAutoWidth(true);
        grid.addColumn(MyInvoiceRow::invoiceNumber).setHeader("Rechnungsnummer").setAutoWidth(true);
        grid.addColumn(MyInvoiceRow::date).setHeader("Datum").setAutoWidth(true);
        grid.addColumn(MyInvoiceRow::amount).setHeader("Betrag").setAutoWidth(true);
        grid.setAllRowsVisible(true);
        grid.setItems(allRows); // zunächst leer

        // Suche (einfacher Text-Filter über alle sichtbaren Felder)
        search.addValueChangeListener(e -> applyFilter(e.getValue()));

        // Paginierungs-Buttons (vorerst ohne Funktion, als Platzhalter)
        Button prev = new Button("Zurück", VaadinIcon.ANGLE_LEFT.create());
        Button next = new Button("Nächste", VaadinIcon.ANGLE_RIGHT.create());
        prev.setEnabled(false);
        next.setEnabled(false);
        HorizontalLayout pager = new HorizontalLayout(prev, next);
        pager.setWidthFull();
        pager.setJustifyContentMode(FlexComponent.JustifyContentMode.END);

        // Zusammenbauen
        card.add(header, controls, grid, pager);
        return card;
    }

    private void applyFilter(String filter) {
        String f = filter == null ? "" : filter.toLowerCase();
        grid.setItems(allRows.stream()
                .filter(row -> row.status.toLowerCase().contains(f) || row.invoiceNumber.toLowerCase().contains(f)
                        || row.date.toString().toLowerCase().contains(f)
                        || String.valueOf(row.amount).toLowerCase().contains(f))
                .toList());
    }

    private Div createCard(String title, Component content) {
        Div card = new Div();
        styleCard(card);
        H3 h3 = new H3(title);
        h3.getStyle().set("margin", "0");
        Div inner = new Div(content);
        inner.getStyle().set("padding", "var(--lumo-space-s)");
        card.add(h3, inner);
        return card;
    }

    private Component labeledValue(String label, String value) {
        Paragraph p = new Paragraph();
        Span sLabel = new Span(label + " ");
        sLabel.getStyle().set("font-weight", "600");
        Span sValue = new Span(value);
        p.add(sLabel, sValue);
        p.getStyle().set("margin", "0");
        return p;
    }

    private void styleCard(Div card) {
        card.getStyle().set("border", "1px solid var(--lumo-contrast-20pct)")
                .set("border-radius", "var(--lumo-border-radius-l)").set("padding", "var(--lumo-space-m)")
                .set("background", "var(--lumo-base-color)").set("box-shadow", "0 1px 1px rgba(0,0,0,0.02)");
        card.setWidthFull();
    }

    // Schlanke lokale Repräsentation für das Grid
    public record MyInvoiceRow(String status, String invoiceNumber, LocalDate date, double amount) {
    }
}
