-- ============================================================
-- Migración website v2 — 2026-06-25
-- Implementa el modelo de datos definido en docs/website.md
-- ============================================================

USE [Banda]
GO

-- ============================================================
-- 1. Nuevos campos en Music.Cancion
-- ============================================================

ALTER TABLE [Music].[Cancion]
    ADD [Descripcion]       nvarchar(max) NULL,
        [AnioComposicion]   int           NULL,
        [IndVisible]        tinyint       NOT NULL CONSTRAINT DF_Cancion_IndVisible    DEFAULT 1,
        [IndDestacado]      tinyint       NOT NULL CONSTRAINT DF_Cancion_IndDestacado  DEFAULT 0,
        [OrdenPublicacion]  int           NULL,
        [FechaEstimada]     date          NULL;
GO

-- ============================================================
-- 2. Actualizar estados de TipoEstadoCancion según website.md
--
--    ANTES de renombrar: actualizar canciones en álbumes no
--    publicados que quedaron marcadas como "Disponible" (id=1).
--    Se reclasifican como "Producción Final" (id=2) porque
--    están terminadas pero pendientes de grabación final.
--
--    Solo afecta canciones que no pertenecen a ningún álbum
--    publicado (IndUltimosLanzamientos = 1).
-- ============================================================

UPDATE c
SET    c.IdTipoEstadoCancion = 2
FROM   [Music].[Cancion]       c
JOIN   [Music].[AlbumCancion]  ac  ON ac.IdCancion = c.IdCancion
JOIN   [Music].[Album]         a   ON a.IdAlbum    = ac.IdAlbum
                                  AND a.IndUltimosLanzamientos = 0
WHERE  c.IndActivo              = 1
  AND  c.IdTipoEstadoCancion   = 1
  AND  NOT EXISTS (
           SELECT 1
           FROM   [Music].[AlbumCancion] ac2
           JOIN   [Music].[Album]        a2  ON a2.IdAlbum = ac2.IdAlbum
                                            AND a2.IndUltimosLanzamientos = 1
           WHERE  ac2.IdCancion = c.IdCancion
       );
GO

-- ============================================================
-- 3. Renombrar TipoEstadoCancion a los estados de website.md
--
--    Mapeo:
--      1 Disponible    → Publicado
--      2 Proximamente  → Producción Final
--      3 Demo          → Grabación
--      4 Archivada     → Regrabación
--      5 (nuevo)       → Mezcla
--      6 (nuevo)       → Mastering
-- ============================================================

UPDATE [Music].[TipoEstadoCancion] SET Descripcion = N'Publicado'         WHERE IdTipoEstadoCancion = 1;
UPDATE [Music].[TipoEstadoCancion] SET Descripcion = N'Producción Final'  WHERE IdTipoEstadoCancion = 2;
UPDATE [Music].[TipoEstadoCancion] SET Descripcion = N'Grabación'         WHERE IdTipoEstadoCancion = 3;
UPDATE [Music].[TipoEstadoCancion] SET Descripcion = N'Regrabación'       WHERE IdTipoEstadoCancion = 4;

INSERT INTO [Music].[TipoEstadoCancion] (Descripcion) VALUES (N'Mezcla');      -- IdTipoEstadoCancion = 5
INSERT INTO [Music].[TipoEstadoCancion] (Descripcion) VALUES (N'Mastering');   -- IdTipoEstadoCancion = 6
GO

-- ============================================================
-- 4. Actualizar vista Music.VWCancion — incluye nuevos campos
-- ============================================================

ALTER VIEW [Music].[VWCancion] AS
SELECT
    c.IdCancion,
    c.Titulo,
    c.IdTipoEstadoCancion,
    tec.Descripcion         AS EstadoCancion,
    c.DuracionSegundos,
    c.AudioRuta,
    c.Letra,
    c.SpotifyUrl,
    c.AppleMusicUrl,
    c.YoutubeMusicUrl,
    c.YoutubeVisualizerId,
    c.IndActivo,
    c.PortadaRuta,
    c.Descripcion,
    c.AnioComposicion,
    c.IndVisible,
    c.IndDestacado,
    c.OrdenPublicacion,
    c.FechaEstimada
FROM [Music].[Cancion] c
JOIN [Music].[TipoEstadoCancion] tec ON tec.IdTipoEstadoCancion = c.IdTipoEstadoCancion;
GO

-- ============================================================
-- 5. Actualizar vista Music.VWCancionesDisponibles
--    "Disponible" fue renombrado a "Publicado"
-- ============================================================

ALTER VIEW [Music].[VWCancionesDisponibles] AS
SELECT
    c.IdCancion,
    c.Titulo,
    c.DuracionSegundos,
    c.AudioRuta,
    c.SpotifyUrl,
    c.AppleMusicUrl,
    c.YoutubeMusicUrl,
    c.YoutubeVisualizerId,
    a.IdAlbum,
    a.Titulo                AS Album,
    a.PortadaRuta,
    ac.NumeroPista
FROM [Music].[Cancion] c
JOIN [Music].[TipoEstadoCancion] tec    ON tec.IdTipoEstadoCancion = c.IdTipoEstadoCancion
JOIN [Music].[AlbumCancion]      ac     ON ac.IdCancion            = c.IdCancion
JOIN [Music].[Album]             a      ON a.IdAlbum               = ac.IdAlbum AND a.IndActivo = 1
WHERE  c.IndActivo       = 1
  AND  tec.Descripcion   = N'Publicado'
  AND  c.AudioRuta       IS NOT NULL;
GO
