-- ══════════════════════════════════════════════════════════════════
-- BASE DE DATOS: Banda  (SQL Server / T-SQL)
-- ══════════════════════════════════════════════════════════════════

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'Banda')
    CREATE DATABASE Banda;
GO

USE Banda;
GO

-- ══════════════════════════════════════════════════════════════════
-- ENUMERADORES
-- ══════════════════════════════════════════════════════════════════

CREATE TABLE TipoAlbum (
    IdTipoAlbum     INT            NOT NULL IDENTITY(1,1),
    Descripcion     NVARCHAR(256)  NOT NULL,
    CONSTRAINT PK_TipoAlbum PRIMARY KEY (IdTipoAlbum)
);
GO

CREATE TABLE TipoEstadoCancion (
    IdTipoEstadoCancion INT            NOT NULL IDENTITY(1,1),
    Descripcion         NVARCHAR(256)  NOT NULL,
    CONSTRAINT PK_TipoEstadoCancion PRIMARY KEY (IdTipoEstadoCancion)
);
GO

CREATE TABLE TipoCredito (
    IdTipoCredito   INT            NOT NULL IDENTITY(1,1),
    Descripcion     NVARCHAR(256)  NOT NULL,
    CONSTRAINT PK_TipoCredito PRIMARY KEY (IdTipoCredito)
);
GO

CREATE TABLE TipoFoto (
    IdTipoFoto      INT            NOT NULL IDENTITY(1,1),
    Descripcion     NVARCHAR(256)  NOT NULL,
    CONSTRAINT PK_TipoFoto PRIMARY KEY (IdTipoFoto)
);
GO

-- ══════════════════════════════════════════════════════════════════
-- TABLAS PRINCIPALES
-- ══════════════════════════════════════════════════════════════════

CREATE TABLE Rol (
    IdRol           INT            NOT NULL IDENTITY(1,1),
    Descripcion     NVARCHAR(256)  NOT NULL,
    IndActivo       TINYINT        NOT NULL DEFAULT 1,
    CONSTRAINT PK_Rol PRIMARY KEY (IdRol)
);
GO

CREATE TABLE Artista (
    IdArtista       INT            NOT NULL IDENTITY(1,1),
    Nombre          NVARCHAR(120)  NOT NULL,
    Descripcion     NVARCHAR(MAX)      NULL,
    FotoRuta        NVARCHAR(500)      NULL,
    IndMiembro      TINYINT        NOT NULL DEFAULT 0,
    Orden           INT            NOT NULL DEFAULT 0,
    IndActivo       TINYINT        NOT NULL DEFAULT 1,
    CONSTRAINT PK_Artista PRIMARY KEY (IdArtista)
);
GO

CREATE TABLE Album (
    IdAlbum                 INT            NOT NULL IDENTITY(1,1),
    Titulo                  NVARCHAR(200)  NOT NULL,
    IdTipoAlbum             INT            NOT NULL,
    FechaLanzamiento        DATE               NULL,
    PortadaRuta             NVARCHAR(500)      NULL,
    Descripcion             NVARCHAR(MAX)      NULL,
    IndUltimosLanzamientos  TINYINT        NOT NULL DEFAULT 0,
    Activo                  TINYINT        NOT NULL DEFAULT 1,
    CONSTRAINT PK_Album PRIMARY KEY (IdAlbum),
    CONSTRAINT FK_Album_TipoAlbum FOREIGN KEY (IdTipoAlbum)
        REFERENCES TipoAlbum (IdTipoAlbum)
);
GO

CREATE TABLE Cancion (
    IdCancion               INT            NOT NULL IDENTITY(1,1),
    Titulo                  NVARCHAR(200)  NOT NULL,
    IdTipoEstadoCancion     INT            NOT NULL,
    DuracionSegundos        INT                NULL,
    AudioRuta               NVARCHAR(500)      NULL,
    Letra                   NVARCHAR(MAX)      NULL,
    Activo                  TINYINT        NOT NULL DEFAULT 1,
    CONSTRAINT PK_Cancion PRIMARY KEY (IdCancion),
    CONSTRAINT FK_Cancion_TipoEstadoCancion FOREIGN KEY (IdTipoEstadoCancion)
        REFERENCES TipoEstadoCancion (IdTipoEstadoCancion)
);
GO

CREATE TABLE Video (
    IdVideo             INT            NOT NULL IDENTITY(1,1),
    Titulo              NVARCHAR(200)  NOT NULL,
    YoutubeId           NVARCHAR(20)       NULL,
    IdCancion           INT                NULL,
    FechaPublicacion    DATE               NULL,
    Activo              TINYINT        NOT NULL DEFAULT 1,
    CONSTRAINT PK_Video PRIMARY KEY (IdVideo),
    CONSTRAINT FK_Video_Cancion FOREIGN KEY (IdCancion)
        REFERENCES Cancion (IdCancion)
);
GO

CREATE TABLE AlbumFoto (
    IdAlbumFoto     INT            NOT NULL IDENTITY(1,1),
    Titulo          NVARCHAR(200)  NOT NULL,
    Descripcion     NVARCHAR(MAX)      NULL,
    FechaEvento     DATE               NULL,
    IndActivo       TINYINT        NOT NULL DEFAULT 1,
    CONSTRAINT PK_AlbumFoto PRIMARY KEY (IdAlbumFoto)
);
GO

CREATE TABLE Foto (
    IdFoto          INT            NOT NULL IDENTITY(1,1),
    Titulo          NVARCHAR(200)      NULL,
    Ruta            NVARCHAR(500)  NOT NULL,
    Descripcion     NVARCHAR(500)      NULL,
    IdTipoFoto      INT                NULL,
    IdAlbumFoto     INT                NULL,
    Orden           INT            NOT NULL DEFAULT 0,
    IndActivo       TINYINT        NOT NULL DEFAULT 1,
    CONSTRAINT PK_Foto PRIMARY KEY (IdFoto),
    CONSTRAINT FK_Foto_TipoFoto   FOREIGN KEY (IdTipoFoto)  REFERENCES TipoFoto (IdTipoFoto),
    CONSTRAINT FK_Foto_AlbumFoto  FOREIGN KEY (IdAlbumFoto) REFERENCES AlbumFoto (IdAlbumFoto)
);
GO

CREATE TABLE Clip (
    IdClip              INT            NOT NULL IDENTITY(1,1),
    IdCancion           INT            NOT NULL,
    Ruta                NVARCHAR(500)  NOT NULL,
    DuracionSegundos    INT                NULL,
    Activo              TINYINT        NOT NULL DEFAULT 1,
    CONSTRAINT PK_Clip PRIMARY KEY (IdClip),
    CONSTRAINT FK_Clip_Cancion FOREIGN KEY (IdCancion) REFERENCES Cancion (IdCancion)
);
GO

-- ══════════════════════════════════════════════════════════════════
-- TABLAS DE RELACIÓN
-- ══════════════════════════════════════════════════════════════════

CREATE TABLE ArtistaRol (
    IdArtistaRol    INT  NOT NULL IDENTITY(1,1),
    IdArtista       INT  NOT NULL,
    IdRol           INT  NOT NULL,
    CONSTRAINT PK_ArtistaRol PRIMARY KEY (IdArtistaRol),
    CONSTRAINT FK_ArtistaRol_Artista  FOREIGN KEY (IdArtista) REFERENCES Artista (IdArtista),
    CONSTRAINT FK_ArtistaRol_Rol      FOREIGN KEY (IdRol)     REFERENCES Rol (IdRol)
);
GO

CREATE TABLE AlbumCancion (
    IdAlbumCancion  INT  NOT NULL IDENTITY(1,1),
    IdAlbum         INT  NOT NULL,
    IdCancion       INT  NOT NULL,
    NumeroPista     INT      NULL,
    CONSTRAINT PK_AlbumCancion PRIMARY KEY (IdAlbumCancion),
    CONSTRAINT FK_AlbumCancion_Album    FOREIGN KEY (IdAlbum)   REFERENCES Album (IdAlbum),
    CONSTRAINT FK_AlbumCancion_Cancion  FOREIGN KEY (IdCancion) REFERENCES Cancion (IdCancion)
);
GO

CREATE TABLE AlbumArtista (
    IdAlbumArtista  INT  NOT NULL IDENTITY(1,1),
    IdAlbum         INT  NOT NULL,
    IdArtista       INT  NOT NULL,
    IdTipoCredito   INT  NOT NULL,
    CONSTRAINT PK_AlbumArtista PRIMARY KEY (IdAlbumArtista),
    CONSTRAINT FK_AlbumArtista_Album        FOREIGN KEY (IdAlbum)       REFERENCES Album (IdAlbum),
    CONSTRAINT FK_AlbumArtista_Artista      FOREIGN KEY (IdArtista)     REFERENCES Artista (IdArtista),
    CONSTRAINT FK_AlbumArtista_TipoCredito  FOREIGN KEY (IdTipoCredito) REFERENCES TipoCredito (IdTipoCredito)
);
GO

CREATE TABLE CancionArtista (
    IdCancionArtista INT  NOT NULL IDENTITY(1,1),
    IdCancion        INT  NOT NULL,
    IdArtista        INT  NOT NULL,
    IdTipoCredito    INT  NOT NULL,
    CONSTRAINT PK_CancionArtista PRIMARY KEY (IdCancionArtista),
    CONSTRAINT FK_CancionArtista_Cancion        FOREIGN KEY (IdCancion)     REFERENCES Cancion (IdCancion),
    CONSTRAINT FK_CancionArtista_Artista        FOREIGN KEY (IdArtista)     REFERENCES Artista (IdArtista),
    CONSTRAINT FK_CancionArtista_TipoCredito    FOREIGN KEY (IdTipoCredito) REFERENCES TipoCredito (IdTipoCredito)
);
GO

-- ══════════════════════════════════════════════════════════════════
-- VISTAS
-- ══════════════════════════════════════════════════════════════════

-- Tracklist de cada álbum con estado de cada canción
CREATE VIEW VWAlbumTracklist AS
SELECT
    a.IdAlbum,
    a.Titulo                AS Album,
    ta.Descripcion          AS TipoAlbum,
    a.FechaLanzamiento,
    a.PortadaRuta,
    ac.NumeroPista,
    c.IdCancion,
    c.Titulo                AS Cancion,
    c.DuracionSegundos,
    c.AudioRuta,
    tec.Descripcion         AS EstadoCancion
FROM Album a
JOIN TipoAlbum ta               ON ta.IdTipoAlbum           = a.IdTipoAlbum
JOIN AlbumCancion ac            ON ac.IdAlbum               = a.IdAlbum
JOIN Cancion c                  ON c.IdCancion              = ac.IdCancion AND c.IndActivo = 1
JOIN TipoEstadoCancion tec      ON tec.IdTipoEstadoCancion  = c.IdTipoEstadoCancion
WHERE a.IndActivo = 1;
GO

-- Créditos detallados por canción
CREATE VIEW VWCreditosCancion AS
SELECT
    c.IdCancion,
    c.Titulo                AS Cancion,
    ar.IdArtista,
    ar.Nombre               AS Artista,
    tc.Descripcion          AS TipoCredito
FROM Cancion c
JOIN CancionArtista ca      ON ca.IdCancion     = c.IdCancion
JOIN Artista ar             ON ar.IdArtista     = ca.IdArtista
JOIN TipoCredito tc         ON tc.IdTipoCredito = ca.IdTipoCredito
WHERE c.IndActivo = 1;
GO

-- Canciones disponibles con audio listo (para el reproductor)
CREATE VIEW VWCancionesDisponibles AS
SELECT
    c.IdCancion,
    c.Titulo,
    c.DuracionSegundos,
    c.AudioRuta,
    a.IdAlbum,
    a.Titulo                AS Album,
    a.PortadaRuta,
    ac.NumeroPista
FROM Cancion c
JOIN TipoEstadoCancion tec      ON tec.IdTipoEstadoCancion  = c.IdTipoEstadoCancion
JOIN AlbumCancion ac            ON ac.IdCancion             = c.IdCancion
JOIN Album a                    ON a.IdAlbum                = ac.IdAlbum AND a.IndActivo = 1
WHERE c.Activo          = 1
  AND tec.Descripcion   = N'Disponible'
  AND c.AudioRuta       IS NOT NULL;
GO

-- ══════════════════════════════════════════════════════════════════
-- VISTAS DE ENTIDAD
-- ══════════════════════════════════════════════════════════════════

CREATE VIEW VWCancion AS
SELECT
    c.IdCancion,
    c.Titulo,
    c.IdTipoEstadoCancion,
    tec.Descripcion         AS EstadoCancion,
    c.DuracionSegundos,
    c.AudioRuta,
    c.Letra,
    c.IndActivo
FROM Cancion c
JOIN TipoEstadoCancion tec  ON tec.IdTipoEstadoCancion = c.IdTipoEstadoCancion;
GO

CREATE VIEW VWAlbum AS
SELECT
    a.IdAlbum,
    a.Titulo,
    a.IdTipoAlbum,
    ta.Descripcion          AS Album,
    a.FechaLanzamiento,
    a.PortadaRuta,
    a.Descripcion,
    a.IndUltimosLanzamientos,
    a.IndActivo
FROM Album a
JOIN TipoAlbum ta           ON ta.IdTipoAlbum = a.IdTipoAlbum;
GO

CREATE VIEW VWArtista AS
SELECT
    a.IdArtista,
    a.Nombre,
    a.Descripcion,
    a.FotoRuta,
    a.IndMiembro,
    a.Orden,
    a.IndActivo
FROM Artista a;
GO

CREATE VIEW VWVideo AS
SELECT
    v.IdVideo,
    v.Titulo,
    v.YoutubeId,
    v.IdCancion,
    c.Titulo                AS Cancion,
    v.FechaPublicacion,
    v.IndActivo
FROM Video v
LEFT JOIN Cancion c         ON c.IdCancion = v.IdCancion;
GO

CREATE VIEW VWAlbumFoto AS
SELECT
    af.IdAlbumFoto,
    af.Titulo,
    af.Descripcion,
    af.FechaEvento,
    af.IndActivo
FROM AlbumFoto af;
GO

CREATE VIEW VWFoto AS
SELECT
    f.IdFoto,
    f.Titulo,
    f.Ruta,
    f.Descripcion,
    f.IdTipoFoto,
    tf.Descripcion          AS TipoFoto,
    f.IdAlbumFoto,
    af.Titulo               AS AlbumFoto,
    f.Orden,
    f.IndActivo
FROM Foto f
LEFT JOIN TipoFoto tf       ON tf.IdTipoFoto   = f.IdTipoFoto
LEFT JOIN AlbumFoto af      ON af.IdAlbumFoto  = f.IdAlbumFoto;
GO

CREATE VIEW VWClip AS
SELECT
    cl.IdClip,
    cl.IdCancion,
    c.Titulo                AS Cancion,
    cl.Ruta,
    cl.DuracionSegundos,
    cl.IndActivo
FROM Clip cl
JOIN Cancion c              ON c.IdCancion = cl.IdCancion;
GO

CREATE VIEW VWRol AS
SELECT
    r.IdRol,
    r.Descripcion,
    r.IndActivo
FROM Rol r;
GO

CREATE VIEW VWArtistaRol AS
SELECT
    ar.IdArtistaRol,
    ar.IdArtista,
    a.Nombre                AS Artista,
    ar.IdRol,
    r.Descripcion           AS Rol
FROM ArtistaRol ar
JOIN Artista a              ON a.IdArtista = ar.IdArtista
JOIN Rol r                  ON r.IdRol     = ar.IdRol;
GO

CREATE VIEW VWAlbumCancion AS
SELECT
    ac.IdAlbumCancion,
    ac.IdAlbum,
    a.Titulo                AS Album,
    a.FechaLanzamiento,
    ac.NumeroPista,
    ac.IdCancion,
    c.Titulo                AS Cancion
FROM AlbumCancion ac
JOIN Album a                ON a.IdAlbum   = ac.IdAlbum
JOIN Cancion c              ON c.IdCancion = ac.IdCancion;
GO

CREATE VIEW VWAlbumArtista AS
SELECT
    aa.IdAlbumArtista,
    aa.IdAlbum,
    a.Titulo                AS Album,
    aa.IdArtista,
    ar.Nombre               AS Artista,
    aa.IdTipoCredito,
    tc.Descripcion          AS TipoCredito
FROM AlbumArtista aa
JOIN Album a                ON a.IdAlbum          = aa.IdAlbum
JOIN Artista ar             ON ar.IdArtista       = aa.IdArtista
JOIN TipoCredito tc         ON tc.IdTipoCredito   = aa.IdTipoCredito;
GO

CREATE VIEW VWCancionArtista AS
SELECT
    ca.IdCancionArtista,
    ca.IdCancion,
    c.Titulo                AS Cancion,
    ca.IdArtista,
    ar.Nombre               AS Artista,
    ca.IdTipoCredito,
    tc.Descripcion          AS TipoCredito
FROM CancionArtista ca
JOIN Cancion c              ON c.IdCancion        = ca.IdCancion
JOIN Artista ar             ON ar.IdArtista       = ca.IdArtista
JOIN TipoCredito tc         ON tc.IdTipoCredito   = ca.IdTipoCredito;
GO

-- ══════════════════════════════════════════════════════════════════
-- DATOS INICIALES
-- ══════════════════════════════════════════════════════════════════

INSERT INTO TipoAlbum (Descripcion) VALUES
    (N'Álbum'),
    (N'Single'),
    (N'EP'),
    (N'Demo');

INSERT INTO TipoEstadoCancion (Descripcion) VALUES
    (N'Disponible'),
    (N'Próximamente'),
    (N'Demo'),
    (N'Archivada');

INSERT INTO TipoCredito (Descripcion) VALUES
    (N'Artista Principal'),
    (N'Artista Invitado'),
    (N'Compositor'),
    (N'Letra'),
    (N'Producción'),
    (N'Mezcla'),
    (N'Mastering');

INSERT INTO Rol (Descripcion) VALUES
    (N'Sintetizadores'),
    (N'Guitarras'),
    (N'Composición'),
    (N'Producción'),
    (N'Bajo');

INSERT INTO TipoFoto (Descripcion) VALUES
    (N'Concierto'),
    (N'Estudio'),
    (N'Promo'),
    (N'Behind the Scenes');
GO
