-- Migration 002: stored procedure untuk generate dashboard data dari project cpone yang sudah ada
-- Digunakan untuk testing dengan data historis (contoh: Mgm_McuID = 99)

-- Tambah unique key di mcu_patient_schedule agar ON DUPLICATE KEY UPDATE bisa berjalan
ALTER TABLE mcu_patient_schedule
    ADD UNIQUE KEY uq_preregister_schedule (Mcu_PatientSchedulePreregisterID, Mcu_PatientScheduleDate);

ALTER TABLE mcu_checkinout
    DROP INDEX uq_checkinout_id,
    ADD UNIQUE KEY uq_checkinout_segment (
        Mcu_CheckinoutPreregisterID,
        Mcu_CheckinoutDate,
        Mcu_CheckinoutInTime
    );


-- ============================================================
-- sp_generate_dashboard_data
-- Parameter: p_mcu_id INT  (Mgm_McuID dari cpone)
-- Mengisi: mcu_project, mcu_patient, mcu_patient_schedule, mcu_checkinout
-- ============================================================
DROP PROCEDURE IF EXISTS sp_generate_dashboard_data;

DELIMITER $$

CREATE PROCEDURE sp_generate_dashboard_data(IN p_mcu_id INT)
BEGIN

    -- ----------------------------------------------------------
    -- 1. mcu_project
    --    Source: cpone.mgm_mcu JOIN cpone.corporate
    -- ----------------------------------------------------------
    INSERT INTO mcu_project (
        Mcu_ProjectMcuID,
        Mcu_ProjectCorporateID,
        Mcu_ProjectCorporateName,
        Mcu_ProjectNumber,
        Mcu_ProjectLabel,
        Mcu_ProjectBranchID,
        Mcu_ProjectStartDate,
        Mcu_ProjectEndDate,
        Mcu_ProjectIsActive,
        Mcu_ProjectTotalParticipant,
        Mcu_ProjectSyncedAt
    )
    SELECT
        m.Mgm_McuID,
        m.Mgm_McuCorporateID,
        c.CorporateName,
        m.Mgm_McuNumber,
        m.Mgm_McuLabel,
        m.Mgm_McuM_BranchID,
        m.Mgm_McuStartDate,
        m.Mgm_McuEndDate,
        m.Mgm_McuIsActive,
        m.Mgm_McuTotalParticipant,
        NOW()
    FROM cpone.mgm_mcu m
    LEFT JOIN cpone.corporate c ON c.CorporateID = m.Mgm_McuCorporateID
    WHERE m.Mgm_McuID = p_mcu_id
    ON DUPLICATE KEY UPDATE
        Mcu_ProjectCorporateName    = VALUES(Mcu_ProjectCorporateName),
        Mcu_ProjectLabel            = VALUES(Mcu_ProjectLabel),
        Mcu_ProjectIsActive         = VALUES(Mcu_ProjectIsActive),
        Mcu_ProjectTotalParticipant = VALUES(Mcu_ProjectTotalParticipant),
        Mcu_ProjectSyncedAt         = NOW();


    -- ----------------------------------------------------------
    -- 2. mcu_patient
    --    Source: cpone.mcu_preregister_patients
    -- ----------------------------------------------------------
    INSERT INTO mcu_patient (
        Mcu_PatientPreregisterID,
        Mcu_PatientMcuID,
        Mcu_PatientName,
        Mcu_PatientNIP,
        Mcu_PatientGender,
        Mcu_PatientDOB,
        Mcu_PatientDepartment,
        Mcu_PatientDivision,
        Mcu_PatientPosisi,
        Mcu_PatientIsRegistered,
        Mcu_PatientOrderID,
        Mcu_PatientIsActive,
        Mcu_PatientSyncedAt
    )
    SELECT
        p.Mcu_PreregisterPatientsID,
        p.Mcu_PreregisterPatientsMgm_McuID,
        p.Mcu_PreregisterPatientsPatientName,
        p.Mcu_PreregisterPatientsNIP,
        p.Mcu_PreregisterPatientsGender,
        p.Mcu_PreregisterPatientsDOB,
        p.Mcu_PreregisterPatientsDepartment,
        p.Mcu_PreregisterPatientsDivisi,
        p.Mcu_PreregisterPatientsPosisi,
        p.Mcu_PreregisterPatientsIsRegistered,
        p.Mcu_PreregisterPatientsT_OrderHeaderID,
        p.Mcu_PreregisterPatientsIsActive,
        NOW()
    FROM cpone.mcu_preregister_patients p
    WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id
    AND   p.Mcu_PreregisterPatientsIsActive = 'Y'
    ON DUPLICATE KEY UPDATE
        Mcu_PatientName         = VALUES(Mcu_PatientName),
        Mcu_PatientIsRegistered = VALUES(Mcu_PatientIsRegistered),
        Mcu_PatientOrderID      = VALUES(Mcu_PatientOrderID),
        Mcu_PatientSyncedAt     = NOW();


    -- ----------------------------------------------------------
    -- 3. mcu_patient_schedule
    --    Source: T_OrderHeaderDate sebagai jadwal checkin
    --    Hanya untuk pasien yang sudah punya order
    -- ----------------------------------------------------------
    INSERT INTO mcu_patient_schedule (
        Mcu_PatientSchedulePreregisterID,
        Mcu_PatientScheduleDate,
        Mcu_PatientScheduleIsActive,
        Mcu_PatientScheduleSyncedAt
    )
    SELECT
        p.Mcu_PreregisterPatientsID,
        DATE(o.T_OrderHeaderDate),
        'Y',
        NOW()
    FROM cpone.mcu_preregister_patients p
    JOIN cpone.t_orderheader o
        ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID
    WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id
    AND   p.Mcu_PreregisterPatientsT_OrderHeaderID > 0
    AND   p.Mcu_PreregisterPatientsIsActive = 'Y'
    ON DUPLICATE KEY UPDATE
        Mcu_PatientScheduleSyncedAt = NOW();


    -- ----------------------------------------------------------
    -- 4. mcu_checkinout
    --    Satu baris per tanggal proses.
    --    Check-in  : tanggal header untuk hari pertama, atau event paling awal untuk hari lanjutan.
    --    Check-out : event paling akhir pada tanggal itu.
    -- ----------------------------------------------------------
    INSERT INTO mcu_checkinout (
        Mcu_CheckinoutCheckinoutID,
        Mcu_CheckinoutPreregisterID,
        Mcu_CheckinoutOrderID,
        Mcu_CheckinoutDate,
        Mcu_CheckinoutInTime,
        Mcu_CheckinoutOutTime,
        Mcu_CheckinoutNextDate,
        Mcu_CheckinoutIsActive,
        Mcu_CheckinoutSyncedAt
    )
    SELECT
        src.order_id,
        src.preregister_id,
        src.order_id,
        src.segment_date,
        TIME(src.checkin_dt),
        TIME(src.checkout_dt),
        CASE
            WHEN DATE(src.checkout_dt) = src.segment_date THEN NULL
            ELSE DATE(src.checkout_dt)
        END,
        'Y',
        NOW()
    FROM (
        SELECT
            o.T_OrderHeaderID AS order_id,
            p.Mcu_PreregisterPatientsID AS preregister_id,
            o.T_OrderHeaderDate AS header_dt,
            ev.segment_date,
            CASE
                WHEN ev.segment_date = DATE(o.T_OrderHeaderDate) THEN o.T_OrderHeaderDate
                ELSE MIN(ev.event_dt)
            END AS checkin_dt,
            MAX(ev.event_dt) AS checkout_dt
        FROM cpone.mcu_preregister_patients p
        JOIN cpone.t_orderheader o
            ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID
        JOIN (
            SELECT
                p2.Mcu_PreregisterPatientsID AS preregister_id,
                o2.T_OrderHeaderID AS order_id,
                o2.T_OrderHeaderDate AS checkin_dt,
                DATE(o2.T_OrderHeaderDate) AS segment_date,
                o2.T_OrderHeaderDate AS event_dt
            FROM cpone.mcu_preregister_patients p2
            JOIN cpone.t_orderheader o2
                ON o2.T_OrderHeaderID = p2.Mcu_PreregisterPatientsT_OrderHeaderID
            WHERE p2.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id
            AND   p2.Mcu_PreregisterPatientsT_OrderHeaderID > 0
            AND   p2.Mcu_PreregisterPatientsIsActive = 'Y'
            UNION ALL
            SELECT
                p2.Mcu_PreregisterPatientsID AS preregister_id,
                o2.T_OrderHeaderID AS order_id,
                o2.T_OrderHeaderDate AS checkin_dt,
                DATE(TIMESTAMP(s2.T_OrderSampleReceiveDate, s2.T_OrderSampleReceiveTime)) AS segment_date,
                TIMESTAMP(s2.T_OrderSampleReceiveDate, s2.T_OrderSampleReceiveTime) AS event_dt
            FROM cpone.mcu_preregister_patients p2
            JOIN cpone.t_orderheader o2
                ON o2.T_OrderHeaderID = p2.Mcu_PreregisterPatientsT_OrderHeaderID
            JOIN cpone.t_ordersample s2
                ON  s2.T_OrderSampleT_OrderHeaderID = o2.T_OrderHeaderID
                AND s2.T_OrderSampleIsActive = 'Y'
            WHERE p2.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id
            AND   p2.Mcu_PreregisterPatientsT_OrderHeaderID > 0
            AND   p2.Mcu_PreregisterPatientsIsActive = 'Y'
            AND   s2.T_OrderSampleReceiveDate IS NOT NULL
            AND   s2.T_OrderSampleReceiveTime IS NOT NULL
            UNION ALL
            SELECT
                p2.Mcu_PreregisterPatientsID AS preregister_id,
                o2.T_OrderHeaderID AS order_id,
                o2.T_OrderHeaderDate AS checkin_dt,
                DATE(TIMESTAMP(ts2.T_SamplingSoDoneDate, ts2.T_SamplingSoDoneTime)) AS segment_date,
                TIMESTAMP(ts2.T_SamplingSoDoneDate, ts2.T_SamplingSoDoneTime) AS event_dt
            FROM cpone.mcu_preregister_patients p2
            JOIN cpone.t_orderheader o2
                ON o2.T_OrderHeaderID = p2.Mcu_PreregisterPatientsT_OrderHeaderID
            JOIN cpone.t_samplingso ts2
                ON  ts2.T_SamplingSoT_OrderHeaderID = o2.T_OrderHeaderID
                AND ts2.T_SamplingSoIsActive = 'Y'
            WHERE p2.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id
            AND   p2.Mcu_PreregisterPatientsT_OrderHeaderID > 0
            AND   p2.Mcu_PreregisterPatientsIsActive = 'Y'
            AND   ts2.T_SamplingSoDoneDate IS NOT NULL
            AND   ts2.T_SamplingSoDoneTime IS NOT NULL
        ) ev
            ON ev.preregister_id = p.Mcu_PreregisterPatientsID
           AND ev.order_id = o.T_OrderHeaderID
        WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id
        AND   p.Mcu_PreregisterPatientsT_OrderHeaderID > 0
        AND   p.Mcu_PreregisterPatientsIsActive = 'Y'
        GROUP BY
            o.T_OrderHeaderID,
            p.Mcu_PreregisterPatientsID,
            o.T_OrderHeaderDate,
            ev.segment_date
    ) AS src
    ON DUPLICATE KEY UPDATE
        Mcu_CheckinoutOutTime   = VALUES(Mcu_CheckinoutOutTime),
        Mcu_CheckinoutNextDate  = VALUES(Mcu_CheckinoutNextDate),
        Mcu_CheckinoutSyncedAt  = NOW();

END $$

DELIMITER ;
