DELIMITER //

CREATE OR REPLACE FUNCTION zen_get_ext_button(
  p_functionTag VARCHAR(20),
  p_button_type CHAR(1),
  p_ip VARCHAR(100),   -- 'https://api.gex.com.tw:5443'
  p_db VARCHAR(100)    -- 'zenBusiness'
)
RETURNS TEXT
/*
  function   : 回傳擴充 button 的設定內容
  description: 
  build date : 2022/2/5
  
  call sample:
  SELECT zen_get_ext_button('basm67','U');
  
  modify history
    item who        date       modify docs
    ==== ========== ========== ================================================
    1    Michael    2022-2-5   新增
    2    Michael    2023-1-29  重新想清處並定義相關設定, 然後修改相關程式, 詳細請參見註解
    3    Michael    2023-02-01 為了更加彈性, @ip 及 @db 這2個欄位改傳入 ${ls:xxxx}, 測試可行(程式要調整前端呼叫的程式)
*/
BEGIN
  DECLARE v_cnt INT;
  DECLARE v_crlf VARCHAR(2);
  DECLARE v_comma VARCHAR(1);
  DECLARE v_fcaption VARCHAR(100);
  DECLARE v_icon VARCHAR(100);
  DECLARE v_related_menuid VARCHAR(100);
  DECLARE v_rets TEXT;
  DECLARE v_para_field VARCHAR(100);  
  DECLARE v_new_para_field VARCHAR(100); 
  DECLARE v_ls_paras_field VARCHAR(100);  -- button 按下後, 要帶到另一個表單的 pk 值
  DECLARE v_ls_paras_no INT;              -- 參數代號 zenutil.js -> function local_set_params(id, value)
  DECLARE v_imax INT;
  DECLARE v_inow INT;
  --
  DECLARE p_uuid VARCHAR(100);
  DECLARE v_sp_name VARCHAR(100); -- sp_name
  DECLARE v_para1 VARCHAR(100);   -- 有 token 一定要放在第一個
  DECLARE v_para2 VARCHAR(100);
  DECLARE v_para3 VARCHAR(100);
  DECLARE v_para4 VARCHAR(100);
  DECLARE v_data_para1 VARCHAR(200);
  DECLARE v_data_para2 VARCHAR(200);
  
  -- 臨時表儲存 JSON 數據
  DROP TEMPORARY TABLE IF EXISTS temp_jsondata;
  CREATE TEMPORARY TABLE temp_jsondata (
    rowid INT AUTO_INCREMENT PRIMARY KEY,
    fcaption VARCHAR(20),
    icon VARCHAR(50),
    related_menuid VARCHAR(200),  -- 關聯功能(或是呼叫某 sp)
    para_field VARCHAR(100),
    ls_paras_field VARCHAR(100),
    ls_paras_no INT
  );
  
  SET v_crlf = CONCAT(CHAR(13), CHAR(10));
  
  -- 插入資料到臨時表
  INSERT INTO temp_jsondata (fcaption, icon, related_menuid, para_field, ls_paras_field, ls_paras_no)
  SELECT 
    fcaption, icon, related_menuid, para_field, ls_paras_field, ls_paras_no
  FROM zen_function_button fn
  WHERE fn.FunctionTag = p_functionTag AND button_type = p_button_type
  ORDER BY buttonid;
  
  -- 回傳 options []
  SELECT COUNT(*) INTO v_imax FROM temp_jsondata;
  SET v_inow = 1;
  SET v_rets = '';
  SET v_comma = ',';
  
  WHILE v_inow <= v_imax DO
    -- 取得當前行數據
    SELECT fcaption, icon, related_menuid, para_field, ls_paras_field, ls_paras_no 
    INTO v_fcaption, v_icon, v_related_menuid, v_para_field, v_ls_paras_field, v_ls_paras_no
    FROM temp_jsondata 
    WHERE rowid = v_inow;
    
    IF IFNULL(v_icon, '') = '' THEN 
      SET v_icon = 'fas fa-binoculars';
    END IF;
    
    IF IFNULL(v_ls_paras_no, 0) = 0 THEN 
      SET v_ls_paras_no = 0;
    END IF;
    
    /*
      只要後 2個參數 ls_paras_field,ls_paras_no 有值, 就表示是呼叫外部專案, 否則就只是單純的 v_new_para_field
      接下來, 判斷 para_field 是否為空
      a.如果為空, 表示要傳入 ls_paras_field 這個欄位的值
      b.如果不為空, 且首碼為 _ , 表示要傳入固定字串, 否則還是傳入 ls_paras_field 這個欄位的值(自定義變數, 防錯而已)
      Michael 2023-1-29 好難理解阿, 會這麼複雜, 是因為不斷擴充定義, 且沒有完全考慮清楚的後果, 目前這樣定義應該是 OK 的
    */
    SET v_data_para1 = '';
    SET v_data_para2 = '';
    SET v_new_para_field = '';
    
    -- 取得傳遞參數的資料
    IF IFNULL(v_ls_paras_field, '') <> '' AND IFNULL(v_ls_paras_no, 0) > 0 THEN
      -- 防錯碼(重複設定)
      IF IFNULL(v_para_field, '') = CONCAT('_', v_ls_paras_field) THEN 
        SET v_para_field = '';
      END IF;
    
      IF IFNULL(v_para_field, '') = '' THEN
        SET v_data_para1 = CONCAT(',', v_crlf, '            "_', v_ls_paras_field, '": "${', v_ls_paras_field, '}"', v_crlf);
        SET v_data_para2 = CONCAT(',', v_crlf, '            "requestAdaptor": "local_set_params(', CAST(v_ls_paras_no AS CHAR), ',api.data._', v_ls_paras_field, '); return { ...api, data: { ...api.data }};"', v_crlf);
      ELSEIF SUBSTRING(v_para_field, 1, 1) = '_' THEN
        -- 表示要傳入固定值內容, 非欄位值內容
        SET v_data_para1 = CONCAT(',', v_crlf, '            "', v_para_field, '": "', v_ls_paras_field, '"', v_crlf);
        SET v_data_para2 = CONCAT(',', v_crlf, '            "requestAdaptor": "local_set_params(', CAST(v_ls_paras_no AS CHAR), ',api.data.', v_para_field, '); return { ...api, data: { ...api.data }};"', v_crlf);
      ELSE 
        -- 要自己命名變數(防錯而已, 不應有此設定)
        SET v_data_para1 = CONCAT(',', v_crlf, '            "_', v_para_field, '": "${', v_ls_paras_field, '}"', v_crlf);
        SET v_data_para2 = CONCAT(',', v_crlf, '            "requestAdaptor": "local_set_params(', CAST(v_ls_paras_no AS CHAR), ',api.data._', v_para_field, '); return { ...api, data: { ...api.data }};"', v_crlf);
      END IF;
    ELSE
      IF IFNULL(v_para_field, '') <> '' THEN
        SET v_new_para_field = CONCAT('@${', v_para_field, '}');
      END IF;
    END IF;
    
    -- 新支援 button call sp 並傳參數
    IF LOCATE(',', v_related_menuid) > 0 THEN
      IF IFNULL(v_icon, '') = '' THEN 
        SET v_icon = 'fab fa-angellist text-success';
      END IF;
      
      -- 取出 sp 及參數(目前做多允許 4 個參數)
	  SET p_uuid = UUID();
	  CALL gp_split(p_uuid, v_related_menuid,',');
	  select col INTO v_sp_name from _split where guid = p_uuid and rowid = 1;
	  select col INTO v_para1 from _split where guid = p_uuid and rowid = 2;
	  select col INTO v_para2 from _split where guid = p_uuid and rowid = 3;
	  select col INTO v_para3 from _split where guid = p_uuid and rowid = 4;
	  select col INTO v_para4 from _split where guid = p_uuid and rowid = 5;
	  DELETE FROM _split WHERE guid = p_uuid;
	  
      -- 要特殊控制 db, 目前先 hard code 2023-02-04 Michael
      IF v_sp_name = 'zen_showsource' THEN 
        SET p_db = '${ls:wizard_db}';
      END IF;
      
      IF IFNULL(v_para1, '') = '' THEN SET v_para1 = ''; END IF;
      IF IFNULL(v_para2, '') = '' THEN SET v_para2 = ''; END IF;
      IF IFNULL(v_para3, '') = '' THEN SET v_para3 = ''; END IF;
      IF IFNULL(v_para4, '') = '' THEN SET v_para4 = ''; END IF;
      
      IF v_para1 = 'token' THEN
        SET v_para1 = CONCAT('        "token": "${ls:token}"', IF(v_para2 = '', '', ','), v_crlf);
        IF v_para2 <> '' THEN 
          SET v_para2 = CONCAT('        "para02": "${', v_para2, '}"', IF(v_para3 = '', '', ','), v_crlf);
        END IF;
        IF v_para3 <> '' THEN 
          SET v_para3 = CONCAT('        "para03": "${', v_para3, '}"', IF(v_para4 = '', '', ','), v_crlf);
        END IF;
        IF v_para4 <> '' THEN 
          SET v_para4 = CONCAT('        "para04": "${', v_para4, '}"', v_crlf);
        END IF;
      ELSE
        IF v_para1 <> '' THEN 
          SET v_para1 = CONCAT('        "para01": "${', v_para1, '}"', IF(v_para2 = '', '', ','), v_crlf);
        END IF;
        IF v_para2 <> '' THEN 
          SET v_para2 = CONCAT('        "para02": "${', v_para2, '}"', IF(v_para3 = '', '', ','), v_crlf);
        END IF;
        IF v_para3 <> '' THEN 
          SET v_para3 = CONCAT('        "para03": "${', v_para3, '}"', IF(v_para4 = '', '', ','), v_crlf);
        END IF;
        IF v_para4 <> '' THEN 
          SET v_para4 = CONCAT('        "para04": "${', v_para4, '}"', v_crlf);
        END IF;
      END IF;
      
      -- button & call sp
      SET v_rets = CONCAT(v_rets,
        '{', v_crlf,
        '    "type": "button",', v_crlf,
        '    "icon": "', v_icon, '",', v_crlf,
        '    "actionType": "ajax",', v_crlf,
        '    "tooltip": "', v_fcaption, '",', v_crlf,
        '    "confirmText": "確定要執行本作業?",', v_crlf,  -- 將本公告設為已讀
        '    "api": {', v_crlf,
        '      "method": "post",', v_crlf,
        '      "url": "', p_ip, '/xapi/v2/', p_db, '/', v_sp_name, '/1/",', v_crlf,
        '      "data": {', v_crlf,
        v_para1, v_para2, v_para3, v_para4,
        '      },', v_crlf,
        '      "dataType": "form"', v_crlf,
        '    }', v_crlf,
        '  }', v_comma, v_crlf);
      
      SET v_inow = v_inow + 1;
    ELSE
      /*
        此處目前總共有3種情況, 稍後繼續改
        1.呼叫擴充子表單, 如 person call person_agent, 要傳 personid
        2.呼叫另一支程式, 如 會議記錄 call 協同工作單, 要傳 functiontag (來源單別)
        3.呼叫外部專案程式, 如行事曆 call FullCalendar, 傳參必須透過 local_set_params
        4.執行 sp, (在前一段程式專門處理了)
        5.其他(目前無)
        
        related_menuid 關聯表單代號
        para_field 傳參欄名 -> 欄位名稱前是否要加 _ , 主要是看是否為外部專案程式, 如果是呼叫外部程式, 才要加 _ , 且要在 data 區定義
        ls_paras_field 擴充參數名
        ls_paras_no 參數代碼
        
        PS: 昨天晚上查了半天, 怎麼我產生的程式 ${ls:query_id} 都不見了, 後來才發現是因為 zen_showsource 這支 core sp 會在顯示 Code 時 replace
        資料庫中的 code 是 ok 的。所以這並不是問題, 一個問題是因為現在是利用 orm_api 的 para 8, 這個機制一般 ok, 
        但是 basperson_agent 同時有 personid 和 agentid 時就有問題, 可能要改用 para 9/10 才行, Thinking
      */
      SET v_rets = CONCAT(v_rets,
        '{', v_crlf,
        '    "type": "button",', v_crlf,
        -- Inner 不須加 title, level 可以後續手動修改
        IF(p_button_type = 'U', 
           CONCAT('    "label": "', v_fcaption, '",', v_crlf,
                  '    "level": "success",', v_crlf),
           ''),
        '    "icon": "', v_icon, '",', v_crlf,
        '    "actionType": "dialog",', v_crlf,
        '    "tooltip": "', v_fcaption, '",', v_crlf,
        '    "dialog": {', v_crlf,
        '      "//title": "新增-', v_fcaption, '",', v_crlf,
        '      "actions": [],', v_crlf,
        '      "size": "full",', v_crlf,
        '      "body": {', v_crlf,
        '        "type": "service",', v_crlf,
        '        "schemaApi": {', v_crlf,
        '          "method": "post",', v_crlf,
        '          "url": "', p_ip, '/xapi/v2/${ls:wizard_db}/zen_showsource/0/",', v_crlf,
        '          "data": {', v_crlf,
        '            "para01": "', v_related_menuid, '",', v_crlf,
        '            "para02": "beta', v_new_para_field, '"', v_crlf,
        v_data_para1,
        '          },', v_crlf,
        '          "dataType": "form"', v_crlf,
        v_data_para2,
        '        }', v_crlf,
        '      }', v_crlf,
        '    }', v_crlf,
        '  }', v_comma, v_crlf);
      
      SET v_inow = v_inow + 1;
    END IF;
  END WHILE;
  
  DROP TEMPORARY TABLE IF EXISTS temp_jsondata;
  
  RETURN IFNULL(v_rets, '');
END //

DELIMITER ;