-- migration_pieces_detachees.sql
-- À exécuter une seule fois dans phpMyAdmin (onglet SQL) sur shopnet_db
--
-- Adapté du schéma partagé ShopNet/BoutikPro : id_categorie, id_piece et les
-- autres identifiants de pièces restent en UUID (CHAR(36)) pour rester
-- compatibles avec une synchronisation BoutikPro future. SEUL id_boutique
-- est adapté en INT, pour coller à boutiques.id qui est déjà un entier
-- auto-incrémenté dans ShopNet — pas de colonne uuid ajoutée à `boutiques`.

CREATE TABLE IF NOT EXISTS categories_pieces (
    id_categorie        CHAR(36)     NOT NULL PRIMARY KEY,
    parent_id            CHAR(36)     NULL,
    type_vehicule        ENUM('moto','voiture','commun') NOT NULL DEFAULT 'commun',
    nom_categorie        VARCHAR(150) NOT NULL,
    slug                 VARCHAR(160) NULL,
    ordre_affichage      INT          NOT NULL DEFAULT 0,
    icone                VARCHAR(100) NULL,
    actif                TINYINT(1)   NOT NULL DEFAULT 1,
    created_at           DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at           DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_categorie_parent
        FOREIGN KEY (parent_id) REFERENCES categories_pieces(id_categorie)
        ON DELETE SET NULL,
    INDEX idx_categorie_type (type_vehicule),
    INDEX idx_categorie_parent (parent_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS pieces (
    id_piece             CHAR(36)     NOT NULL PRIMARY KEY,
    id_categorie          CHAR(36)     NOT NULL,
    reference             VARCHAR(80)  NULL,
    code_barre            VARCHAR(50)  NULL,
    nom_piece             VARCHAR(200) NOT NULL,
    description           TEXT         NULL,
    marque_piece          VARCHAR(100) NULL,
    unite_mesure          VARCHAR(20)  NOT NULL DEFAULT 'unité',
    prix_achat            DECIMAL(12,2) NULL,
    prix_vente_defaut     DECIMAL(12,2) NOT NULL DEFAULT 0,
    seuil_alerte_stock    INT          NOT NULL DEFAULT 5,
    poids_kg              DECIMAL(8,3) NULL,
    actif                 TINYINT(1)   NOT NULL DEFAULT 1,
    source_creation        ENUM('shopnet','boutikpro') NOT NULL DEFAULT 'shopnet',
    created_at            DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at            DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_piece_categorie
        FOREIGN KEY (id_categorie) REFERENCES categories_pieces(id_categorie)
        ON DELETE RESTRICT,
    INDEX idx_piece_reference (reference),
    INDEX idx_piece_code_barre (code_barre),
    FULLTEXT INDEX ft_piece_nom (nom_piece, description)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS piece_compatibilite (
    id_compatibilite     CHAR(36)     NOT NULL PRIMARY KEY,
    id_piece             CHAR(36)     NOT NULL,
    marque_vehicule       VARCHAR(80)  NOT NULL,
    modele_vehicule       VARCHAR(100) NOT NULL,
    annee_debut           SMALLINT     NULL,
    annee_fin             SMALLINT     NULL,
    motorisation          VARCHAR(100) NULL,
    CONSTRAINT fk_compat_piece
        FOREIGN KEY (id_piece) REFERENCES pieces(id_piece)
        ON DELETE CASCADE,
    INDEX idx_compat_marque_modele (marque_vehicule, modele_vehicule)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS piece_images (
    id_image             CHAR(36)     NOT NULL PRIMARY KEY,
    id_piece             CHAR(36)     NOT NULL,
    url_image            VARCHAR(255) NOT NULL,
    ordre_affichage       INT          NOT NULL DEFAULT 0,
    CONSTRAINT fk_image_piece
        FOREIGN KEY (id_piece) REFERENCES pieces(id_piece)
        ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- id_boutique en INT (au lieu de CHAR(36)) — pointe vers boutiques.id existant
CREATE TABLE IF NOT EXISTS piece_prix_boutique (
    id_prix_boutique     CHAR(36)     NOT NULL PRIMARY KEY,
    id_piece             CHAR(36)     NOT NULL,
    id_boutique           INT          NOT NULL,
    prix_vente            DECIMAL(12,2) NOT NULL,
    updated_at            DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_prixboutique_piece
        FOREIGN KEY (id_piece) REFERENCES pieces(id_piece)
        ON DELETE CASCADE,
    CONSTRAINT fk_prixboutique_boutique
        FOREIGN KEY (id_boutique) REFERENCES boutiques(id)
        ON DELETE CASCADE,
    UNIQUE KEY uq_piece_boutique (id_piece, id_boutique)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- id_boutique en INT ici aussi
CREATE TABLE IF NOT EXISTS mouvements_stock_pieces (
    id_mouvement         CHAR(36)     NOT NULL PRIMARY KEY,
    id_piece             CHAR(36)     NOT NULL,
    id_boutique           INT          NOT NULL,
    type_mouvement        ENUM('entree','sortie','ajustement','transfert','vente','retour') NOT NULL,
    quantite              INT          NOT NULL,
    quantite_apres         INT          NULL,
    motif                 VARCHAR(255) NULL,
    reference_document     VARCHAR(100) NULL,
    id_utilisateur        CHAR(36)     NULL,
    origine                ENUM('shopnet','boutikpro') NOT NULL DEFAULT 'shopnet',
    synced                TINYINT(1)   NOT NULL DEFAULT 1,
    created_at            DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_mouvement_piece
        FOREIGN KEY (id_piece) REFERENCES pieces(id_piece)
        ON DELETE RESTRICT,
    CONSTRAINT fk_mouvement_boutique
        FOREIGN KEY (id_boutique) REFERENCES boutiques(id)
        ON DELETE CASCADE,
    INDEX idx_mouvement_piece_boutique (id_piece, id_boutique),
    INDEX idx_mouvement_sync (synced)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE OR REPLACE VIEW vue_stock_actuel AS
SELECT
    m.id_piece,
    m.id_boutique,
    SUM(
        CASE
            WHEN m.type_mouvement IN ('entree','retour','ajustement') THEN m.quantite
            WHEN m.type_mouvement IN ('sortie','vente','transfert') THEN -m.quantite
            ELSE 0
        END
    ) AS stock_disponible
FROM mouvements_stock_pieces m
GROUP BY m.id_piece, m.id_boutique;

-- Quelques catégories de départ pour démarrer sans page vide
INSERT INTO categories_pieces (id_categorie, type_vehicule, nom_categorie, ordre_affichage) VALUES
    (UUID(), 'commun', 'Freinage', 1),
    (UUID(), 'commun', 'Moteur', 2),
    (UUID(), 'commun', 'Électricité', 3),
    (UUID(), 'moto', 'Transmission moto', 4),
    (UUID(), 'voiture', 'Suspension voiture', 5),
    (UUID(), 'commun', 'Carrosserie & accessoires', 6);
