package dev.lions.unionflow.server.repository;

import dev.lions.unionflow.server.entity.Ticket;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.persistence.TypedQuery;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * Repository pour l'entité Ticket
 * 
 * @author UnionFlow Team
 * @version 1.0
 */
@ApplicationScoped
public class TicketRepository extends BaseRepository<Ticket> {

    public TicketRepository() {
        super(Ticket.class);
    }

    /**
     * Trouve tous les tickets d'un utilisateur
     */
    public List<Ticket> findByUtilisateurId(UUID utilisateurId) {
        TypedQuery<Ticket> query = entityManager.createQuery(
                "SELECT t FROM Ticket t WHERE t.utilisateurId = :utilisateurId AND t.actif = true ORDER BY t.dateCreation DESC",
                Ticket.class);
        query.setParameter("utilisateurId", utilisateurId);
        return query.getResultList();
    }

    /**
     * Trouve un ticket par son numéro
     */
    public Optional<Ticket> findByNumeroTicket(String numeroTicket) {
        TypedQuery<Ticket> query = entityManager.createQuery(
                "SELECT t FROM Ticket t WHERE t.numeroTicket = :numeroTicket AND t.actif = true",
                Ticket.class);
        query.setParameter("numeroTicket", numeroTicket);
        return query.getResultList().stream().findFirst();
    }

    /**
     * Trouve les tickets par statut
     */
    public List<Ticket> findByStatut(String statut) {
        TypedQuery<Ticket> query = entityManager.createQuery(
                "SELECT t FROM Ticket t WHERE t.statut = :statut AND t.actif = true ORDER BY t.dateCreation DESC",
                Ticket.class);
        query.setParameter("statut", statut);
        return query.getResultList();
    }

    /**
     * Compte les tickets par statut pour un utilisateur
     * Si statut est null, compte tous les tickets de l'utilisateur
     */
    public long countByStatutAndUtilisateurId(String statut, UUID utilisateurId) {
        String jpql;
        if (statut == null) {
            jpql = "SELECT COUNT(t) FROM Ticket t WHERE t.utilisateurId = :utilisateurId AND t.actif = true";
        } else {
            jpql = "SELECT COUNT(t) FROM Ticket t WHERE t.statut = :statut AND t.utilisateurId = :utilisateurId AND t.actif = true";
        }
        TypedQuery<Long> query = entityManager.createQuery(jpql, Long.class);
        if (statut != null) {
            query.setParameter("statut", statut);
        }
        query.setParameter("utilisateurId", utilisateurId);
        return query.getSingleResult();
    }

    /**
     * Génère un numéro de ticket unique
     */
    public String genererNumeroTicket() {
        String prefix = "TK-" + java.time.Year.now().getValue() + "-";
        TypedQuery<Long> query = entityManager.createQuery(
                "SELECT COUNT(t) FROM Ticket t WHERE t.numeroTicket LIKE :prefix",
                Long.class);
        query.setParameter("prefix", prefix + "%");
        long count = query.getSingleResult();
        return prefix + String.format("%04d", count + 1);
    }
}
