package dev.lions.btpxpress.view;

import jakarta.annotation.PostConstruct;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import lombok.Getter;
import lombok.Setter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

@Named("chantiersView")
@ViewScoped
@Getter
@Setter
public class ChantiersView extends BaseListView<ChantiersView.Chantier, Long> implements Serializable {
    
    private static final Logger LOG = LoggerFactory.getLogger(ChantiersView.class);

    private String filtreNom;
    private String filtreClient;
    private String filtreStatut;
    private Long chantierId;

    @PostConstruct
    public void init() {
        if (filtreStatut == null) {
            filtreStatut = "TOUS";
        }
        loadItems();
    }

    /**
     * Définit le filtre de statut (utilisé depuis les pages filtrées).
     */
    public void setFiltreStatut(String statut) {
        this.filtreStatut = statut;
    }

    @Override
    public void loadItems() {
        loading = true;
        try {
            items = new ArrayList<>();
            for (int i = 1; i <= 20; i++) {
                Chantier c = new Chantier();
                c.setId((long) i);
                c.setNom("Chantier " + i);
                c.setClient("Client " + (i % 5 + 1));
                c.setAdresse("123 Rue Exemple " + i + ", 75001 Paris");
                c.setDateDebut(LocalDate.now().minusDays(i * 10));
                c.setDateFinPrevue(LocalDate.now().plusDays((20 - i) * 10));
                c.setStatut(i % 3 == 0 ? "TERMINE" : (i % 3 == 1 ? "EN_COURS" : "PLANIFIE"));
                c.setAvancement(i * 5);
                c.setBudget(i * 15000.0);
                c.setCoutReel(i * 12000.0);
                items.add(c);
            }
            applyFilters(items, buildFilters());
        } catch (Exception e) {
            LOG.error("Erreur chargement chantiers", e);
        } finally {
            loading = false;
        }
    }

    private List<Predicate<Chantier>> buildFilters() {
        List<Predicate<Chantier>> filters = new ArrayList<>();
        if (filtreNom != null && !filtreNom.trim().isEmpty()) {
            filters.add(c -> c.getNom().toLowerCase().contains(filtreNom.toLowerCase()));
        }
        if (filtreClient != null && !filtreClient.trim().isEmpty()) {
            filters.add(c -> c.getClient().toLowerCase().contains(filtreClient.toLowerCase()));
        }
        if (filtreStatut != null && !filtreStatut.trim().isEmpty() && !"TOUS".equals(filtreStatut)) {
            filters.add(c -> c.getStatut().equals(filtreStatut));
        }
        return filters;
    }

    @Override
    protected void resetFilterFields() {
        filtreNom = null;
        filtreClient = null;
        filtreStatut = "TOUS";
    }

    @Override
    protected String getDetailsPath() {
        return "/chantiers/";
    }

    @Override
    protected String getCreatePath() {
        return "/chantiers/nouveau";
    }

    @Override
    protected void performDelete() {
        LOG.info("Suppression chantier : {}", selectedItem.getId());
    }

    /**
     * Initialise un nouveau chantier pour la création.
     */
    @Override
    public String createNew() {
        selectedItem = new Chantier();
        selectedItem.setStatut("PLANIFIE");
        selectedItem.setAvancement(0);
        selectedItem.setDateDebut(LocalDate.now());
        return getCreatePath() + "?faces-redirect=true";
    }

    /**
     * Sauvegarde un nouveau chantier.
     */
    public String saveNew() {
        if (selectedItem == null) {
            selectedItem = new Chantier();
        }
        selectedItem.setId(System.currentTimeMillis()); // Simulation ID
        selectedItem.setDateCreation(LocalDateTime.now());
        selectedItem.setDateModification(LocalDateTime.now());
        items.add(selectedItem);
        LOG.info("Nouveau chantier créé : {}", selectedItem.getNom());
        return "/chantiers?faces-redirect=true";
    }

    /**
     * Charge un chantier par son ID depuis les paramètres de la requête.
     */
    public void loadChantierById() {
        if (chantierId != null) {
            loadItems(); // S'assurer que les items sont chargés
            selectedItem = items.stream()
                    .filter(c -> c.getId().equals(chantierId))
                    .findFirst()
                    .orElse(null);
            if (selectedItem == null) {
                LOG.warn("Chantier avec ID {} non trouvé", chantierId);
            }
        }
    }

    /**
     * Affiche les détails d'un chantier.
     */
    public String viewDetails(Long id) {
        selectedItem = items.stream()
                .filter(c -> c.getId().equals(id))
                .findFirst()
                .orElse(null);
        if (selectedItem != null) {
            return getDetailsPath() + "details?id=" + id + "&faces-redirect=true";
        }
        return "/chantiers?faces-redirect=true";
    }

    @lombok.Getter
    @lombok.Setter
    public static class Chantier {
        private Long id;
        private String nom;
        private String client;
        private String adresse;
        private LocalDate dateDebut;
        private LocalDate dateFinPrevue;
        private String statut;
        private int avancement;
        private double budget;
        private double coutReel;
        private LocalDateTime dateCreation;
        private LocalDateTime dateModification;
    }
}
