package com.example.views;

import com.example.components.Card;
import com.example.components.Fa;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.dataview.GridListDataView;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.value.ValueChangeMode;
import com.vaadin.flow.router.HasDynamicTitle;
import com.vaadin.flow.router.Route;

import java.text.NumberFormat;
import java.util.List;
import java.util.Locale;

/**
 * Example view demonstrating a {@link Grid} with dummy data and a
 * live text filter across all columns.
 */
@Route("tabelle")
public class TableView extends VerticalLayout implements HasDynamicTitle {

    private record Mitarbeiter(String name, String abteilung, String stadt, double gehalt) {
    }

    private static final List<Mitarbeiter> MITARBEITER = List.of(
            new Mitarbeiter("Anna Schmidt", "Entwicklung", "Berlin", 68000),
            new Mitarbeiter("Jonas Becker", "Vertrieb", "Hamburg", 54000),
            new Mitarbeiter("Lena Fischer", "Marketing", "München", 59000),
            new Mitarbeiter("Paul Wagner", "Support", "Köln", 47000),
            new Mitarbeiter("Mia Hoffmann", "Geschäftsführung", "Frankfurt", 95000),
            new Mitarbeiter("Felix Bauer", "Entwicklung", "Stuttgart", 71000),
            new Mitarbeiter("Sophie Richter", "Vertrieb", "Wien", 52000),
            new Mitarbeiter("Tim Klein", "Marketing", "Zürich", 63000),
            new Mitarbeiter("Laura Wolf", "Support", "Leipzig", 45000),
            new Mitarbeiter("Max Neumann", "Entwicklung", "Dresden", 69000),
            new Mitarbeiter("Nina Schröder", "Geschäftsführung", "Düsseldorf", 98000),
            new Mitarbeiter("David Zimmermann", "Vertrieb", "Nürnberg", 55000));

    private static final NumberFormat GEHALT_FORMAT = NumberFormat.getCurrencyInstance(Locale.GERMANY);

    public TableView() {
        addClassName("dialect-content");

        TextField suche = new TextField();
        suche.setPlaceholder(getTranslation("table.search"));
        suche.setPrefixComponent(Fa.SEARCH.create());
        suche.setClearButtonVisible(true);
        suche.setValueChangeMode(ValueChangeMode.EAGER);
        suche.setWidthFull();

        Grid<Mitarbeiter> grid = new Grid<>();
        grid.setWidthFull();
        grid.addColumn(Mitarbeiter::name).setHeader(getTranslation("col.name")).setSortable(true);
        grid.addColumn(Mitarbeiter::abteilung).setHeader(getTranslation("col.department")).setSortable(true);
        grid.addColumn(Mitarbeiter::stadt).setHeader(getTranslation("col.city")).setSortable(true);
        grid.addColumn(m -> GEHALT_FORMAT.format(m.gehalt())).setHeader(getTranslation("col.salary")).setSortable(true);

        GridListDataView<Mitarbeiter> dataView = grid.setItems(MITARBEITER);
        suche.addValueChangeListener(e -> dataView.refreshAll());
        dataView.addFilter(mitarbeiter -> matches(mitarbeiter, suche.getValue()));

        VerticalLayout content = new VerticalLayout(suche, grid);
        content.setPadding(false);
        content.setSpacing(true);

        add(new Card(getTranslation("card.employees"), content));
    }

    @Override
    public String getPageTitle() {
        return getTranslation("page.table");
    }

    private static boolean matches(Mitarbeiter mitarbeiter, String filter) {
        if (filter == null || filter.isBlank()) {
            return true;
        }
        String suchbegriff = filter.trim().toLowerCase(Locale.GERMANY);
        return mitarbeiter.name().toLowerCase(Locale.GERMANY).contains(suchbegriff)
                || mitarbeiter.abteilung().toLowerCase(Locale.GERMANY).contains(suchbegriff)
                || mitarbeiter.stadt().toLowerCase(Locale.GERMANY).contains(suchbegriff);
    }
}
