USE [FirstSolutionDB]
GO

-- ============================================================
-- SP: cedlab_Chart_AllSeriesV2
-- Restituisce tutte le serie (CTF + UL) in un unico round-trip.
-- Usata da ChartDataServiceV2 per il grafico V2.
--
-- Logica UL: identica a cedlab_Chart_DailyUL1, estesa a tutti i
-- sottostanti del certificato in un unico UNION ALL.
--
-- Output (ordinato IDUnderlyings ASC, Px_date ASC):
--   IDUnderlyings  INT      -- 0 = CTF, altrimenti UnderlyingsID
--   Px_date        DATE
--   Performance    DECIMAL  -- % su strike/nominal
--
-- Colonne con <<< verify: adatta al tuo schema reale.
-- ============================================================

CREATE OR ALTER PROCEDURE [dbo].[cedlab_Chart_AllSeriesV2]
    @isin NVARCHAR(12)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @IDCertificates INT;
    DECLARE @Nominal        DECIMAL(18, 6);

    SELECT TOP 1
        @IDCertificates = c.IDCertificates,          -- <<< verify
        @Nominal        = c.Nominal_amount            -- <<< verify: valore nominale per CTF %
    FROM [dbo].[Certificates] c                       -- <<< verify: nome tabella certificati
    WHERE c.ISIN = @isin;

    IF @IDCertificates IS NULL RETURN;

    -- ── CTE: calcola performance per ogni serie, TOP 350 per-serie ─────
    WITH AllSeriesRaw AS
    (
        -- ── Serie CTF (IDUnderlyings = 0) ────────────────────────────────
        -- Performance = PX_LAST_EOD / Nominal * 100
        SELECT
            0                                              AS IDUnderlyings,
            pc.Px_date,
            CONVERT(DECIMAL(18, 4),
                pc.PX_LAST_EOD / NULLIF(@Nominal, 0) * 100
            )                                              AS Performance,
            ROW_NUMBER() OVER (
                PARTITION BY 0
                ORDER BY pc.Px_date DESC
            )                                              AS rn
        FROM dbo.Prices pc
        WHERE pc.CertificatesID = @IDCertificates
          AND pc.PX_LAST_EOD IS NOT NULL
          AND pc.PX_LAST_EOD <> 0

        UNION ALL

        -- ── Serie UL (una per ogni sottostante) ──────────────────────────
        -- Stessa logica di cedlab_Chart_DailyUL1, estesa a tutti gli UL.
        -- Date allineate al CTF (INNER JOIN su Px_date).
        SELECT
            pu.UnderlyingsID                               AS IDUnderlyings,
            pu.Px_date,
            CONVERT(DECIMAL(18, 4),
                CASE
                    WHEN ISNULL(u.AdjustedPrices, 0) = 0 THEN pu.Px_close
                    ELSE pu.Px_closeadj
                END
                / NULLIF(u.Strike, 0) * 100
            )                                              AS Performance,
            ROW_NUMBER() OVER (
                PARTITION BY pu.UnderlyingsID
                ORDER BY pu.Px_date DESC
            )                                              AS rn
        FROM dbo.Prices pu
        LEFT JOIN dbo.Underlyings u
            ON u.IDUnderlyings = pu.UnderlyingsID
        -- Allinea date UL al CTF (solo date presenti nel certificato)
        INNER JOIN dbo.Prices pc
            ON pu.Px_date = pc.Px_date
           AND pc.CertificatesID = @IDCertificates
           AND pc.PX_LAST_EOD IS NOT NULL
           AND pc.PX_LAST_EOD <> 0
        WHERE u.IDCertificates = @IDCertificates      -- <<< verify: colonna FK in Underlyings
          AND (
                pu.px_low   IS NOT NULL OR pu.Px_high  IS NOT NULL OR
                pu.Px_open  IS NOT NULL OR pu.Px_close IS NOT NULL
              )
          AND pu.px_date >= u.StartDate               -- <<< verify: colonna StartDate in Underlyings
    )

    -- ── Filtra TOP 350 per serie e reinverte in ordine ASC ───────────────
    SELECT
        IDUnderlyings,
        Px_date,
        Performance
    FROM AllSeriesRaw
    WHERE rn <= 350
    ORDER BY IDUnderlyings ASC, Px_date ASC;

END
GO
