/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.triz.trizservice.bean;

import com.triz.trizservice.modeles.ServiceFonctiongroupe;
import com.triz.trizservice.modeles.ServiceFonctionnaliter;
import com.triz.trizservice.modeles.ServiceGroupe;
import com.triz.trizservice.modeles.ServiceUser;
import com.triz.trizservice.modeles.object.GenerateIDObject;
import com.triz.trizservice.service.TransactionService;
import com.triz.util.UtilContext;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 *
 * @author Asma
 */
@Component("formGroupBean")
@Scope("view")
public class FormGroupBean {

    private boolean canEdit;
    private boolean isNew;
    private boolean isActif;
    private String groupe;
    private String modifier;
    private ServiceUser user;
    private ServiceGroupe groupeSelected;
    private ServiceFonctiongroupe fonctionSelected;
    private List<ServiceFonctionnaliter> listeAllFonctionnalite;
    private List<ServiceFonctiongroupe> listeFonctionnalite;
    private List<ServiceFonctiongroupe> listeFonctionsASupprimer = new ArrayList<>();
    private List<ServiceFonctionnaliter> Source;
    private List<ServiceFonctionnaliter> Target;

    @Autowired
    public TransactionService service;

    @Autowired
    public UtilContext context;

    @PostConstruct
    public void init() {
        System.out.println("//--------------init()FormGroupBean ");
        Source = new ArrayList<>();
        Target = new ArrayList<>();
        user = context.getCurrentUser();
        if (modifier != null) {
            if (modifier.equals("true")) {
                canEdit = true;
            }
        }
        if (groupe != null) {
            System.out.println("hello 1");
            groupeSelected = service.getGroupsById(groupe);
        } else {
            System.out.println("hello 2");
            if (canEdit) {
                System.out.println("hello 3");
                isNew = true;
            }
            groupeSelected = new ServiceGroupe();
        }

        if (modifier != null) {
            listeAllFonctionnalite = service.getAllFonctionalite();
            for (ServiceFonctionnaliter f : listeAllFonctionnalite) {
                Source.add(f);
            }
            if (groupe != null) {
                listeAllFonctionnalite = service.getFonctionServerByGroups(groupeSelected);
            } else {
                listeAllFonctionnalite = new ArrayList<>();
            }
            for (ServiceFonctionnaliter f : listeAllFonctionnalite) {
                Target.add(f);
            }
            for (ServiceFonctionnaliter s : Target) {
                if (Source.contains(s)) {
                    Source.remove(s);
                }
            }
        }
        if (groupe != null) {
            listeFonctionnalite = service.getAllFonctionsGroupesByGroupe(groupeSelected);
        }
    }

    public void ajouterFonctionnalitesAuGroupe() {
        if (Target != null && !Target.isEmpty()) {

            if (listeFonctionnalite == null) {
                listeFonctionnalite = new ArrayList<>();
            }

            for (ServiceFonctionnaliter f : Target) {
                boolean existe = false;

                for (ServiceFonctiongroupe fg : listeFonctionnalite) {
                    if (fg.getFkFonction().getId().equals(f.getId())) {
                        existe = true;
                        break;
                    }
                }

                if (!existe) {
                    ServiceFonctiongroupe newFg = new ServiceFonctiongroupe();
                   // newFg.setId(groupeSelected.getId() + f.getId());
                    newFg.setFkFonction(f);
                    newFg.setFkGroupe(groupeSelected);
                    newFg.setCanCreate("true");
                    newFg.setCanUpdate("true");
                    newFg.setCanDelete("true");
                    newFg.setCanUpdateDate("true");
                    listeFonctionnalite.add(newFg);
                }
            }

            Source.removeAll(Target);
            Target.clear();
        }
    }

    public void deletefonction() {
        if (fonctionSelected != null && listeFonctionnalite != null) {
            listeFonctionnalite.remove(fonctionSelected);
            listeFonctionsASupprimer.add(fonctionSelected); // Marquer pour suppression

            if (!Source.contains(fonctionSelected.getFkFonction())) {
                Source.add(fonctionSelected.getFkFonction());
            }

            fonctionSelected = null;
        }
    }

    public String saveGroupe() {
        if (isNew) {
            System.out.println("hello from save 1");
            String id = GenerateIDObject.genererIdGroups(service);
            while (service.getGroupsById(id) != null) {
                id = GenerateIDObject.genererIdGroups(service);
            }
            groupeSelected.setId(id);
            groupeSelected.setActif("true");
            service.save(groupeSelected);
            context.saveNewManipulation("Groupe", groupeSelected.getId(), "Ajouter Groupe", new Date(), new Date(), user, 0d, 0d);
        }else{
            System.out.println("hello from save 2");
            service.save(groupeSelected);
        }

        // Sauvegarde des fonctionnalités (ajoutées ou modifiées)
        if (listeFonctionnalite != null) {
            for (ServiceFonctiongroupe fg : listeFonctionnalite) {
                service.saveFonctionsGroupes(fg);
            }
        }

        // Suppression des fonctionnalités supprimées
        if (listeFonctionsASupprimer != null) {
            for (ServiceFonctiongroupe fg : listeFonctionsASupprimer) {
                service.removeFonctionsGroupes(fg);
            }
            listeFonctionsASupprimer.clear(); // Nettoyage
        }

        return consulterGroups();
    }

    public String voirGroupe() {
        if (!isNew) {
            if (!canEdit) {
                return "list.xhtml?faces-redirect=true";
            } else {
                return "form.xhtml?faces-redirect=true&groupe=" + groupeSelected.getId();
            }
        } else {
            return "list.xhtml?faces-redirect=true";
        }
    }

    public String consulterGroups() {
        return "form.xhtml?faces-redirect=true&canEdit=false&groupe=" + groupeSelected.getId();
    }

    public String editGroupe() {
        return "form.xhtml?faces-redirect=true&canEdit=true&groupe=" + groupeSelected.getId();
    }

    public String supprimeGroupe() {
        System.out.println("Hi ");
        groupeSelected.setActif("false");
        service.save(groupeSelected);
        return listeGroupe();
    }

    public String listeGroupe() {
        return "list.xhtml?faces-redirect=true";
    }

    public boolean isCanEdit() {
        return canEdit;
    }

    public void setCanEdit(boolean canEdit) {
        this.canEdit = canEdit;
    }

    public boolean isIsNew() {
        return isNew;
    }

    public void setIsNew(boolean isNew) {
        this.isNew = isNew;
    }

    public boolean isIsActif() {
        return isActif;
    }

    public void setIsActif(boolean isActif) {
        this.isActif = isActif;
    }

    public String getGroupe() {
        return groupe;
    }

    public void setGroupe(String groupe) {
        this.groupe = groupe;
    }

    public String getModifier() {
        return modifier;
    }

    public void setModifier(String modifier) {
        this.modifier = modifier;
    }

    public ServiceUser getUser() {
        return user;
    }

    public void setUser(ServiceUser user) {
        this.user = user;
    }

    public ServiceGroupe getGroupeSelected() {
        return groupeSelected;
    }

    public void setGroupeSelected(ServiceGroupe groupeSelected) {
        this.groupeSelected = groupeSelected;
    }

    public List<ServiceFonctionnaliter> getListeAllFonctionnalite() {
        return listeAllFonctionnalite;
    }

    public void setListeAllFonctionnalite(List<ServiceFonctionnaliter> listeAllFonctionnalite) {
        this.listeAllFonctionnalite = listeAllFonctionnalite;
    }

    public List<ServiceFonctiongroupe> getListeFonctionnalite() {
        return listeFonctionnalite;
    }

    public void setListeFonctionnalite(List<ServiceFonctiongroupe> listeFonctionnalite) {
        this.listeFonctionnalite = listeFonctionnalite;
    }

    public ServiceFonctiongroupe getFonctionSelected() {
        return fonctionSelected;
    }

    public void setFonctionSelected(ServiceFonctiongroupe fonctionSelected) {
        this.fonctionSelected = fonctionSelected;
    }

    public List<ServiceFonctionnaliter> getSource() {
        return Source;
    }

    public void setSource(List<ServiceFonctionnaliter> Source) {
        this.Source = Source;
    }

    public List<ServiceFonctionnaliter> getTarget() {
        return Target;
    }

    public void setTarget(List<ServiceFonctionnaliter> Target) {
        this.Target = Target;
    }
}
