package de.assecutor.pdftool.ui;

import com.vaadin.flow.component.applayout.AppLayout;
import com.vaadin.flow.component.applayout.DrawerToggle;
import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.Scroller;
import com.vaadin.flow.component.sidenav.SideNav;
import com.vaadin.flow.component.sidenav.SideNavItem;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.theme.lumo.LumoUtility;
import org.springframework.beans.factory.annotation.Value;

/**
 * Rahmenlayout der Anwendung mit linker Sidebar: Navigation zwischen der
 * E-Rechnungs-Erzeugung, dem Rechnungsgenerator (Template-Editor) und dem
 * Adressbuch. Der Titel der aktiven Seite wird oben in der Navbar neben dem
 * Hamburger-Menü angezeigt.
 */
public class MainLayout extends AppLayout {

    /** Titel der aktiven Seite in der Navbar. */
    private final H2 viewTitle = new H2();

    public MainLayout(@Value("${pdftool.version:}") String version) {
        setPrimarySection(Section.DRAWER);

        H1 appName = new H1();
        appName.add(new Span("AIT"));
        if (!version.isBlank()) {
            Span versionLabel = new Span("(" + version + ")");
            // Absolut positioniert an ihrer natürlichen Stelle rechts neben "AIT":
            // die Version nimmt keinen Platz im Layout ein, "AIT" bleibt exakt mittig.
            versionLabel.getStyle()
                    .set("font-size", "var(--lumo-font-size-s)")
                    .set("font-weight", "normal")
                    .set("color", "var(--lumo-secondary-text-color)")
                    .set("position", "absolute")
                    .set("margin-left", "0.3em")
                    // unten an der Schriftlinie von "AIT" ausrichten
                    .set("bottom", "0.2em");
            appName.add(versionLabel);
        }
        appName.addClassNames(LumoUtility.FontSize.LARGE, LumoUtility.Margin.Vertical.MEDIUM);
        appName.setWidth("100%");
        appName.getStyle().set("text-align", "center").set("position", "relative");

        SideNav nav = new SideNav();
        nav.addItem(new SideNavItem("E-Rechnung erzeugen", MainView.class, VaadinIcon.INVOICE.create()));
        nav.addItem(new SideNavItem("Templates", TemplateGeneratorView.class,
                VaadinIcon.FILE_PROCESS.create()));
        nav.addItem(new SideNavItem("Adressbuch", AddressBookView.class, VaadinIcon.BOOK.create()));

        Scroller scroller = new Scroller(nav);
        scroller.addClassNames(LumoUtility.Padding.SMALL);

        viewTitle.addClassNames(LumoUtility.FontSize.LARGE, LumoUtility.Margin.NONE);

        addToDrawer(appName, scroller);
        addToNavbar(new DrawerToggle(), viewTitle);
    }

    @Override
    protected void afterNavigation() {
        super.afterNavigation();
        viewTitle.setText(getCurrentPageTitle());
    }

    /** @return der Titel der aktiven View aus deren {@code @PageTitle}-Annotation. */
    private String getCurrentPageTitle() {
        PageTitle title = getContent().getClass().getAnnotation(PageTitle.class);
        return title != null ? title.value() : "";
    }
}
