DELIMITER //

CREATE OR REPLACE PROCEDURE eip_getCalendar (
  IN p_functiontag VARCHAR(100),
  IN p_userid VARCHAR(20),
  IN p_start VARCHAR(30),
  IN p_end VARCHAR(30)
)
/*
  Function   : 取得行事曆資料, 並考慮雲端時間差問題
  Description: 使用 FullCalendar + Cloud 主機時的時間差處理方案
               a. 在 FullCalendar+Vue 程式中使用 local 時間而非 UTC
               b. Cloud Server 使用 UTC 時間，需進行時間調整
               c. 使用 cloud_addtime 函數調整時間差 (目前設為減8小時)
  Build Date : 2023/07/19 (MariaDB 版本)
    call eip_getcalendar('eipm02','admin','2023-12-31T16:00:00.000Z','2026-12-30T16:00:00.000Z');
	
  Modify History
    Item Who        Date       Modify Docs
    ==== ========== ========== ================================================
    1    Michael    2022/12/14 加入考慮 Azure 的時間差
    2    Michael    2022/12/23 加入 FullCalendar 相關註解說明
    3    Michael    2024/03/11 傳入參數由 tablename 改為 functiontag
    4    Michael    2025/07/20 改寫為 MariaDB 並最佳化(ChatGPT+DeepSeek)
*/
BEGIN
  -- 處理一下日期
  SET p_start = STR_TO_DATE(p_start, '%Y-%m-%dT%H:%i:%s.000Z');
  SET p_end = STR_TO_DATE(p_end, '%Y-%m-%dT%H:%i:%s.000Z');
  
  -- 創建臨時表存儲結果
  DROP TEMPORARY TABLE IF EXISTS tmp_calendar;
  CREATE TEMPORARY TABLE tmp_calendar (
    id VARCHAR(100),
    title NVARCHAR(100),
    start DATETIME,
    end DATETIME,
    create_at VARCHAR(20)
  );
  
  -- 根據不同的 functiontag 查詢不同的表
  CASE p_functiontag
    WHEN 'eipm15' THEN  -- 會議室預約
      INSERT INTO tmp_calendar
      SELECT 
        uniqueno, 
        response_desc, 
        CONCAT(startdate, ' ', starttime),
        CONCAT(end_date, ' ', endtime),
        personid
      FROM eipplace_fc
      WHERE DATE(startdate) >= DATE(p_start)
        AND DATE(end_date) <= DATE(p_end)
        AND (personid = p_userid OR create_user = p_userid OR update_user = p_userid);
    
    WHEN 'eipm13' THEN  -- 會議通知
      INSERT INTO tmp_calendar
      SELECT 
        uniqueno,
        meeting_title,
        CONCAT(startdate, ' ', starttime),
        CONCAT(end_date, ' ', end_time),
        boss_personid
      FROM eipmeetingrec_m
      WHERE DATE(startdate) >= DATE(p_start)
        AND DATE(end_date) <= DATE(p_end)
        AND (boss_personid = p_userid OR create_user = p_userid OR update_user = p_userid);
    
    WHEN 'eipm02' THEN  -- 行程管理
      INSERT INTO tmp_calendar
      SELECT 
        uuid,
        title,
        start_time,
        end_time,
        personid
      FROM eip_new_calendar
      WHERE DATE(start_time) >= DATE(p_start)
        AND DATE(end_time) <= DATE(p_end)
        AND (create_user = p_userid OR personid = p_userid);
    
    ELSE  -- 默認處理 eip_core_calendar
      INSERT INTO tmp_calendar
      SELECT 
        id,
        title,
        start_time,
        end_time,
        personid
      FROM eip_core_calendar
      WHERE start_time >= p_start 
        AND end_time <= p_end 
        AND personid = p_userid;
  END CASE;
  
  -- dataset 0(因為只回傳 dataset = 1 一直會報錯 20251120
  select 0, 'ok' as msg;
  
  -- 處理雲端時間差並返回結果
  SELECT 
    id,
    title,
    -- cloud_addtime(start) AS start,
	start,
    -- cloud_addtime(end) AS end,
	end,
    create_at
  FROM tmp_calendar;
  
  -- 自動清理臨時表 (MariaDB 會話結束時自動刪除)
END //

DELIMITER ;