-- Migration V1.4: Création des tables Tickets, Suggestions, Favoris et Configuration
-- Auteur: UnionFlow Team
-- Date: 2025-12-18
-- Description: Création des tables pour la gestion des tickets support, suggestions utilisateur, favoris et configuration système

-- ============================================
-- TABLE: tickets
-- ============================================
CREATE TABLE IF NOT EXISTS tickets (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    
    -- Champs de base
    numero_ticket VARCHAR(50) NOT NULL UNIQUE,
    utilisateur_id UUID NOT NULL,
    sujet VARCHAR(255) NOT NULL,
    description TEXT,
    
    -- Classification
    categorie VARCHAR(50), -- TECHNIQUE, FONCTIONNALITE, UTILISATION, COMPTE, AUTRE
    priorite VARCHAR(50), -- BASSE, NORMALE, HAUTE, URGENTE
    statut VARCHAR(50) DEFAULT 'OUVERT', -- OUVERT, EN_COURS, EN_ATTENTE, RESOLU, FERME
    
    -- Gestion
    agent_id UUID,
    agent_nom VARCHAR(255),
    
    -- Dates
    date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    date_derniere_reponse TIMESTAMP,
    date_resolution TIMESTAMP,
    date_fermeture TIMESTAMP,
    
    -- Statistiques
    nb_messages INTEGER DEFAULT 0,
    nb_fichiers INTEGER DEFAULT 0,
    note_satisfaction INTEGER CHECK (note_satisfaction >= 1 AND note_satisfaction <= 5),
    
    -- Résolution
    resolution TEXT,
    
    -- Audit (BaseEntity)
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN DEFAULT true NOT NULL,
    
    -- Indexes
    CONSTRAINT fk_ticket_utilisateur FOREIGN KEY (utilisateur_id) REFERENCES membres(id) ON DELETE CASCADE
);

CREATE INDEX idx_ticket_utilisateur ON tickets(utilisateur_id);
CREATE INDEX idx_ticket_statut ON tickets(statut);
CREATE INDEX idx_ticket_categorie ON tickets(categorie);
CREATE INDEX idx_ticket_numero ON tickets(numero_ticket);
CREATE INDEX idx_ticket_date_creation ON tickets(date_creation DESC);

-- ============================================
-- TABLE: suggestions
-- ============================================
CREATE TABLE IF NOT EXISTS suggestions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    
    -- Utilisateur
    utilisateur_id UUID NOT NULL,
    utilisateur_nom VARCHAR(255),
    
    -- Contenu
    titre VARCHAR(255) NOT NULL,
    description TEXT,
    justification TEXT,
    
    -- Classification
    categorie VARCHAR(50), -- UI, FEATURE, PERFORMANCE, SECURITE, INTEGRATION, MOBILE, REPORTING
    priorite_estimee VARCHAR(50), -- BASSE, MOYENNE, HAUTE, CRITIQUE
    statut VARCHAR(50) DEFAULT 'NOUVELLE', -- NOUVELLE, EVALUATION, APPROUVEE, DEVELOPPEMENT, IMPLEMENTEE, REJETEE
    
    -- Statistiques
    nb_votes INTEGER DEFAULT 0,
    nb_commentaires INTEGER DEFAULT 0,
    nb_vues INTEGER DEFAULT 0,
    
    -- Dates
    date_soumission TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    date_evaluation TIMESTAMP,
    date_implementation TIMESTAMP,
    
    -- Version
    version_ciblee VARCHAR(50),
    mise_a_jour TEXT,
    
    -- Audit (BaseEntity)
    date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN DEFAULT true NOT NULL
);

CREATE INDEX idx_suggestion_utilisateur ON suggestions(utilisateur_id);
CREATE INDEX idx_suggestion_statut ON suggestions(statut);
CREATE INDEX idx_suggestion_categorie ON suggestions(categorie);
CREATE INDEX idx_suggestion_date_soumission ON suggestions(date_soumission DESC);
CREATE INDEX idx_suggestion_nb_votes ON suggestions(nb_votes DESC);

-- ============================================
-- TABLE: suggestion_votes
-- ============================================
CREATE TABLE IF NOT EXISTS suggestion_votes (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    suggestion_id UUID NOT NULL,
    utilisateur_id UUID NOT NULL,
    date_vote TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    
    -- Audit
    date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    actif BOOLEAN DEFAULT true NOT NULL,
    
    -- Contrainte d'unicité : un utilisateur ne peut voter qu'une fois par suggestion
    CONSTRAINT uk_suggestion_vote UNIQUE (suggestion_id, utilisateur_id),
    CONSTRAINT fk_vote_suggestion FOREIGN KEY (suggestion_id) REFERENCES suggestions(id) ON DELETE CASCADE
);

CREATE INDEX idx_vote_suggestion ON suggestion_votes(suggestion_id);
CREATE INDEX idx_vote_utilisateur ON suggestion_votes(utilisateur_id);

-- ============================================
-- TABLE: favoris
-- ============================================
CREATE TABLE IF NOT EXISTS favoris (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    
    -- Utilisateur
    utilisateur_id UUID NOT NULL,
    
    -- Type et contenu
    type_favori VARCHAR(50) NOT NULL, -- PAGE, DOCUMENT, CONTACT, RACCOURCI
    titre VARCHAR(255) NOT NULL,
    description VARCHAR(1000),
    url VARCHAR(1000),
    
    -- Présentation
    icon VARCHAR(100),
    couleur VARCHAR(50),
    categorie VARCHAR(100),
    
    -- Organisation
    ordre INTEGER DEFAULT 0,
    
    -- Statistiques
    nb_visites INTEGER DEFAULT 0,
    derniere_visite TIMESTAMP,
    est_plus_utilise BOOLEAN DEFAULT false,
    
    -- Audit (BaseEntity)
    date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN DEFAULT true NOT NULL,
    
    CONSTRAINT fk_favori_utilisateur FOREIGN KEY (utilisateur_id) REFERENCES membres(id) ON DELETE CASCADE
);

CREATE INDEX idx_favori_utilisateur ON favoris(utilisateur_id);
CREATE INDEX idx_favori_type ON favoris(type_favori);
CREATE INDEX idx_favori_categorie ON favoris(categorie);
CREATE INDEX idx_favori_ordre ON favoris(utilisateur_id, ordre);

-- ============================================
-- TABLE: configurations
-- ============================================
CREATE TABLE IF NOT EXISTS configurations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    
    -- Clé unique
    cle VARCHAR(255) NOT NULL UNIQUE,
    
    -- Valeur
    valeur TEXT,
    type VARCHAR(50), -- STRING, NUMBER, BOOLEAN, JSON, DATE
    
    -- Classification
    categorie VARCHAR(50), -- SYSTEME, SECURITE, NOTIFICATION, INTEGRATION, APPEARANCE
    description VARCHAR(1000),
    
    -- Contrôles
    modifiable BOOLEAN DEFAULT true,
    visible BOOLEAN DEFAULT true,
    
    -- Métadonnées (JSON stocké en TEXT)
    metadonnees TEXT,
    
    -- Audit (BaseEntity)
    date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    date_modification TIMESTAMP,
    cree_par VARCHAR(255),
    modifie_par VARCHAR(255),
    version BIGINT DEFAULT 0,
    actif BOOLEAN DEFAULT true NOT NULL
);

CREATE INDEX idx_config_cle ON configurations(cle);
CREATE INDEX idx_config_categorie ON configurations(categorie);
CREATE INDEX idx_config_visible ON configurations(visible) WHERE visible = true;

-- ============================================
-- COMMENTAIRES
-- ============================================
COMMENT ON TABLE tickets IS 'Table pour la gestion des tickets support';
COMMENT ON TABLE suggestions IS 'Table pour la gestion des suggestions utilisateur';
COMMENT ON TABLE suggestion_votes IS 'Table pour gérer les votes sur les suggestions (évite les votes multiples)';
COMMENT ON TABLE favoris IS 'Table pour la gestion des favoris utilisateur';
COMMENT ON TABLE configurations IS 'Table pour la gestion de la configuration système';

