DELIMITER //

CREATE OR REPLACE PROCEDURE zen_create_json_v2(
  IN p_FunctionTag VARCHAR(100),
  IN p_code_id VARCHAR(100)       -- Wizard Template Id
)
/*
  function   : amis Wizard 產生程式的核心程式(Single / Master-Detail)
  description: 
      測試時發現還是有長度的限制, 大約超過 1500 行左右, 就會因為長度被截掉的問題而報錯(這是 SQL 本身的問題(寫入 db時會被截掉), 和 amis 無關)
      長度問題暫時無解, 目前先改為寫到 3個欄位(40000 字左右為一欄), 只能用原始的 json 存放程式, menu 要多一個外部 json 設定
      隨著支援的功能愈來越多, 超過 40000 字應該會是常態, 所以外部 json 應該會是常態(menu 多一個 isLocalMenu 的欄位設定, 測試 ok)
  build date : 2023-12-19
  
  call sample:
  CALL zen_create_json_v2('crmm02','MasterDetailTabs');
  CALL zen_create_json_v2('basm63','SingleGrid');
  -- 單據明細查詢表單
  CALL zen_create_json_v2('crmm02_v','MasterDetail-View');
  CALL zen_create_json_v2('basm67_i','SingleEntry-Insert');
  
  modify history
    item who        date       modify docs
    ==== ========== ========== ================================================
    1    Michael    2023-12-19 開始重構為 v2.0(先 copy v1 完整 source from 20231215)

*/
BEGIN
  DECLARE v_uuid CHAR(36);
  DECLARE v_FunctionTag_org VARCHAR(100);
  DECLARE v_funcName VARCHAR(100);
  DECLARE v_tblName VARCHAR(100);
  DECLARE v_pk VARCHAR(100);
  DECLARE v_database VARCHAR(100);
  DECLARE v_detail_table VARCHAR(100);
  DECLARE v_detail_key VARCHAR(100);
  DECLARE v_isautoinc VARCHAR(1);
  DECLARE v_aside_setup VARCHAR(100);
  DECLARE v_aside_field VARCHAR(100);
  DECLARE v_query_type VARCHAR(1);
  DECLARE v_op_width INT;
  DECLARE v_is_bpm VARCHAR(1);
  DECLARE v_is_extend VARCHAR(1);
  DECLARE v_detail_sort_fieldname VARCHAR(20);
  
  SET v_uuid = UUID();
  
  -- v2: 欲處理資料, 變數寫入 zen_wizard_tmp 暫存表
  DELETE FROM zen_wizard_tmp WHERE create_date < DATE_SUB(NOW(), INTERVAL 1 DAY);
  DELETE FROM zen_wizard_jsondata WHERE create_date < DATE_SUB(NOW(), INTERVAL 1 DAY);
  
  -- v2: 重新設定
  /*
    配合 Wizard 有一併支援 view only, insert only 等不完全程式
    p_FunctionTag = crmm02 產生查詢專用的 ViewForm
    v_FunctionTag_org = crmm02_V
    p_code_id = 
  */
  SET v_FunctionTag_org = p_FunctionTag;  -- 保留原代號
  CALL zen_create_json_reset_codeid(v_uuid, p_FunctionTag, p_code_id, v_query_type);
  
  -- 重新讀出變數值
  SELECT zen_value INTO p_FunctionTag FROM zen_wizard_tmp WHERE uuid = v_uuid AND zen_key = 'FunctionTag';
  SELECT zen_value INTO p_code_id FROM zen_wizard_tmp WHERE uuid = v_uuid AND zen_key = 'code_id';
  
  -- get data from zen_function
  SELECT 
    fn.FunctionName, fn.MainTable, fn.MainKey, pm.api_DBName, fn.detail_table,
    fn.detail_key, fn.isautoinc, fn.aside_setup, fn.aside_field,
    fn.query_type, fn.op_width, fn.is_bpm, fn.is_extend, fn.detail_sort_fieldname
  INTO
    v_funcName, v_tblName, v_pk, v_database, v_detail_table,
    v_detail_key, v_isautoinc, v_aside_setup, v_aside_field,
    v_query_type, v_op_width, v_is_bpm, v_is_extend, v_detail_sort_fieldname
  FROM zen_function fn
  LEFT JOIN zen_project pm ON fn.projectid = pm.projectid
  WHERE fn.FunctionTag = p_FunctionTag;
  
  -- v2: 將主要的 dataset 整理後寫入 
  CALL zen_create_json_prepare_ds('M', v_uuid, p_FunctionTag);
  
  -- v2: 資料預處理
  CALL zen_create_json_prepare(v_uuid, p_FunctionTag, p_code_id, v_is_extend, v_query_type, 
                             v_funcName, v_tblName, v_pk, v_database, v_op_width);
  
  -- 如果 PK 是 identity, 則強制設為 readonly
  IF IFNULL(v_isautoinc, 'N') = 'Y' THEN
    UPDATE zen_fields SET fieldro = 'Y' 
    WHERE FunctionTag = p_FunctionTag AND tablename = v_tblName AND fieldname = v_pk;
  END IF;
  
  -- v2: aside
  CALL zen_create_json_prepare_aside(v_uuid, v_aside_setup);
  
  -- v2: 關於 master-detail 的相關設定(TBD)
  CALL zen_create_json_prepare_detaildata(v_uuid, p_FunctionTag, p_code_id, v_detail_table, 
                                         v_detail_key, v_detail_sort_fieldname, v_query_type);
  
  -- v2: Grid Header 處理(Fields loops)
  CALL zen_create_json_prepare_gridquery(v_uuid, v_query_type);
  
  /*
    以下是核心, 主要是準備 gen code 的前置作業
  */
  -- v2: kernel compoment
  CALL zen_create_json_kernel(v_uuid, p_FunctionTag, v_tblName, v_pk, v_query_type, p_code_id);
    
  -- v2: 將暫存資料整理並寫入 
  CALL zen_create_json_final(v_uuid, p_FunctionTag, p_code_id, v_is_extend, v_pk, v_is_bpm, v_FunctionTag_org);

END //

DELIMITER ;