/* =====================================================
   BASE DE DONNÉES : GestionProduits
   ===================================================== */

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'GestionProduits')
BEGIN
    CREATE DATABASE GestionProduits;
END
GO

USE GestionProduits;
GO

/* =====================================================
   TABLE : Categories
   ===================================================== */
IF OBJECT_ID('dbo.Categories', 'U') IS NOT NULL
    DROP TABLE dbo.Categories;
GO

CREATE TABLE dbo.Categories (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Nom NVARCHAR(100) NOT NULL UNIQUE
);
GO

/* =====================================================
   TABLE : Produits
   ===================================================== */
IF OBJECT_ID('dbo.Produits', 'U') IS NOT NULL
    DROP TABLE dbo.Produits;
GO

CREATE TABLE dbo.Produits (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Code NVARCHAR(50) NOT NULL UNIQUE,
    Nom NVARCHAR(150) NOT NULL,
    CategorieId INT NULL,
    Quantite INT NOT NULL DEFAULT 0,
    SeuilMin INT NOT NULL DEFAULT 0,
    PrixAchat DECIMAL(18,2) NOT NULL DEFAULT 0,
    PrixVente DECIMAL(18,2) NOT NULL DEFAULT 0,
    Statut NVARCHAR(50) NOT NULL DEFAULT 'Actif',
    DateCreation DATETIME NOT NULL DEFAULT GETDATE(),

    CONSTRAINT FK_Produits_Categories
        FOREIGN KEY (CategorieId)
        REFERENCES dbo.Categories(Id)
        ON DELETE NO ACTION
);
GO

/* =====================================================
   TABLE : Mouvements (Entrée / Sortie / Inventaire)
   ===================================================== */
IF OBJECT_ID('dbo.Mouvements', 'U') IS NOT NULL
    DROP TABLE dbo.Mouvements;
GO

CREATE TABLE dbo.Mouvements (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    ProduitId INT NOT NULL,
    Type NVARCHAR(20) NOT NULL, -- Entree / Sortie / Inventaire
    Quantite INT NOT NULL,
    DateMouvement DATETIME NOT NULL DEFAULT GETDATE(),
    Commentaire NVARCHAR(255) NULL,

    CONSTRAINT FK_Mouvements_Produits
        FOREIGN KEY (ProduitId)
        REFERENCES dbo.Produits(Id)
        ON DELETE NO ACTION
);
GO

/* =====================================================
   INDEX (PERFORMANCE)
   ===================================================== */
CREATE INDEX IX_Produits_CategorieId ON dbo.Produits(CategorieId);
CREATE INDEX IX_Mouvements_ProduitId ON dbo.Mouvements(ProduitId);
GO

/* =====================================================
   DONNÉES DE BASE (OPTIONNEL)
   ===================================================== */
INSERT INTO dbo.Categories (Nom) VALUES
('Informatique'),
('Alimentaire'),
('Bureau'),
('Divers');
GO

/* =====================================================
   VUE : Alertes de stock (Quantite <= SeuilMin)
   ===================================================== */
IF OBJECT_ID('dbo.vw_AlertesStock', 'V') IS NOT NULL
    DROP VIEW dbo.vw_AlertesStock;
GO

CREATE VIEW dbo.vw_AlertesStock
AS
SELECT
    p.Id,
    p.Code,
    p.Nom,
    c.Nom AS Categorie,
    p.Quantite,
    p.SeuilMin,
    p.PrixAchat,
    p.PrixVente,
    p.Statut,
    p.DateCreation
FROM dbo.Produits p
LEFT JOIN dbo.Categories c ON c.Id = p.CategorieId
WHERE p.Quantite <= p.SeuilMin;
GO

/* =====================================================
   FIN
   ===================================================== */
PRINT 'Base GestionProduits créée avec succès';
GO
