-- Migration 010: Add age column to mcu_patient and update SP

ALTER TABLE mcu_patient
    ADD COLUMN Mcu_PatientAge INT DEFAULT NULL AFTER Mcu_PatientDOB;

-- Update SP: tambah age dari T_OrderHeader.M_PatientAge
DROP PROCEDURE IF EXISTS sp_generate_dashboard_data;

DELIMITER $$

CREATE PROCEDURE sp_generate_dashboard_data(IN p_mcu_id INT)
BEGIN

    -- ----------------------------------------------------------
    -- 1. mcu_project
    -- ----------------------------------------------------------
    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 (with age)
    -- ----------------------------------------------------------
    INSERT INTO mcu_patient (
        Mcu_PatientPreregisterID, Mcu_PatientMcuID, Mcu_PatientName,
        Mcu_PatientNIP, Mcu_PatientGender, Mcu_PatientDOB, Mcu_PatientAge,
        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,
        o.T_OrderHeaderM_PatientAge,
        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
    LEFT JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID
    WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id
    AND   p.Mcu_PreregisterPatientsIsActive = 'Y'
    ON DUPLICATE KEY UPDATE
        Mcu_PatientName         = VALUES(Mcu_PatientName),
        Mcu_PatientAge          = VALUES(Mcu_PatientAge),
        Mcu_PatientIsRegistered = VALUES(Mcu_PatientIsRegistered),
        Mcu_PatientOrderID      = VALUES(Mcu_PatientOrderID),
        Mcu_PatientSyncedAt     = NOW();


    -- ----------------------------------------------------------
    -- 3. mcu_patient_schedule
    -- ----------------------------------------------------------
    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.
    -- ----------------------------------------------------------
    INSERT INTO mcu_checkinout (
        Mcu_CheckinoutCheckinoutID, Mcu_CheckinoutPreregisterID, Mcu_CheckinoutOrderID,
        Mcu_CheckinoutDate, Mcu_CheckinoutInTime, Mcu_CheckinoutOutTime,
        Mcu_CheckinoutNextDate, Mcu_CheckinoutIsActive, Mcu_CheckinoutSyncedAt, Mcu_CheckinoutMcuID
    )
    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(), p_mcu_id
    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();


    -- ----------------------------------------------------------
    -- 5. mcu_station_progress — lab (dari t_ordersample)
    --    GROUP BY order+station supaya satu baris per pasien per station
    -- ----------------------------------------------------------
    INSERT INTO mcu_station_progress (
        Mcu_StationProgressOrderID, Mcu_StationProgressPreregisterID, Mcu_StationProgressMcuID,
        Mcu_StationProgressStationID, Mcu_StationProgressStationName, Mcu_StationProgressSource,
        Mcu_StationProgressCheckinDate,
        Mcu_StationProgressSamplingAt, Mcu_StationProgressReceiveAt, Mcu_StationProgressProcessAt,
        Mcu_StationProgressDoneAt, Mcu_StationProgressSyncedAt
    )
    SELECT
        o.T_OrderHeaderID,
        p.Mcu_PreregisterPatientsID,
        p_mcu_id,
        s.T_OrderSampleT_SampleStationID,
        ss.T_SampleStationName,
        'lab',
        DATE(o.T_OrderHeaderDate),
        NULLIF(MAX(TIMESTAMP(s.T_OrderSampleSamplingDate,   s.T_OrderSampleSamplingTime)),   '0000-00-00 00:00:00'),
        NULLIF(MAX(TIMESTAMP(s.T_OrderSampleReceiveDate,    s.T_OrderSampleReceiveTime)),    '0000-00-00 00:00:00'),
        NULLIF(MAX(TIMESTAMP(s.T_OrderSampleProcessingDate, s.T_OrderSampleProcessingTime)), '0000-00-00 00:00:00'),
        NULL,
        NOW()
    FROM cpone.mcu_preregister_patients p
    JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID
    JOIN cpone.t_ordersample s  ON s.T_OrderSampleT_OrderHeaderID = o.T_OrderHeaderID AND s.T_OrderSampleIsActive = 'Y'
    JOIN cpone.t_samplestation ss ON ss.T_SampleStationID = s.T_OrderSampleT_SampleStationID
    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, s.T_OrderSampleT_SampleStationID, ss.T_SampleStationName, o.T_OrderHeaderDate
    ON DUPLICATE KEY UPDATE
        Mcu_StationProgressSamplingAt = VALUES(Mcu_StationProgressSamplingAt),
        Mcu_StationProgressReceiveAt  = VALUES(Mcu_StationProgressReceiveAt),
        Mcu_StationProgressProcessAt  = VALUES(Mcu_StationProgressProcessAt),
        Mcu_StationProgressSyncedAt   = NOW();


    -- ----------------------------------------------------------
    -- 6. mcu_station_progress — nonlab (dari t_samplingso)
    -- ----------------------------------------------------------
    INSERT INTO mcu_station_progress (
        Mcu_StationProgressOrderID, Mcu_StationProgressPreregisterID, Mcu_StationProgressMcuID,
        Mcu_StationProgressStationID, Mcu_StationProgressStationName, Mcu_StationProgressSource,
        Mcu_StationProgressCheckinDate,
        Mcu_StationProgressSamplingAt, Mcu_StationProgressReceiveAt, Mcu_StationProgressProcessAt,
        Mcu_StationProgressDoneAt, Mcu_StationProgressSyncedAt
    )
    SELECT
        o.T_OrderHeaderID,
        p.Mcu_PreregisterPatientsID,
        p_mcu_id,
        ts.T_SamplingSoT_SampleStationID,
        ss.T_SampleStationName,
        'nonlab',
        DATE(o.T_OrderHeaderDate),
        NULL,
        NULL,
        NULLIF(MAX(TIMESTAMP(ts.T_SamplingSoProcessDate, ts.T_SamplingSoProcessTime)), '0000-00-00 00:00:00'),
        NULLIF(MAX(TIMESTAMP(ts.T_SamplingSoDoneDate,    ts.T_SamplingSoDoneTime)),    '0000-00-00 00:00:00'),
        NOW()
    FROM cpone.mcu_preregister_patients p
    JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID
    JOIN cpone.t_samplingso ts  ON ts.T_SamplingSoT_OrderHeaderID = o.T_OrderHeaderID AND ts.T_SamplingSoIsActive = 'Y'
    JOIN cpone.t_samplestation ss ON ss.T_SampleStationID = ts.T_SamplingSoT_SampleStationID
    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, ts.T_SamplingSoT_SampleStationID, ss.T_SampleStationName, o.T_OrderHeaderDate
    ON DUPLICATE KEY UPDATE
        Mcu_StationProgressProcessAt = VALUES(Mcu_StationProgressProcessAt),
        Mcu_StationProgressDoneAt    = VALUES(Mcu_StationProgressDoneAt),
        Mcu_StationProgressSyncedAt  = NOW();

END $$

DELIMITER ;
