DELIMITER //

CREATE OR REPLACE PROCEDURE zen_create_json_kernel(
  IN p_uuid VARCHAR(100),
  IN p_FunctionTag VARCHAR(100),
  IN p_tblName VARCHAR(100),
  IN p_pk VARCHAR(100),
  IN p_query_type VARCHAR(1),
  IN p_code_id VARCHAR(100)
)
/*
  功能   : amis Wizard 產生 json UI 的核心程式
  描述: 本段 sp 是設定的主程式, 由此呼叫各自元件 sp, 會重新組合出原 @temp_code 內跟 compoment 的定義內容
        一般記錄到 zen_wizard_jsondata, 少數情況會寫到 zen_wizard_tmp(zen_create_json_transfer)
        仔細看起來, 似乎只有 Cycle 類元件以及 picker, transfer 及 formula 這幾個特殊元件要特別獨立 function 處理
        我覺得還是給每個元件一段 sp, 雖然子程式會變多, 但是會更好維護 Thinking
  建立日期 : 2023/12/20
  
  修改歷史
    項目 誰         日期       修改說明
    ==== ========== ========== ================================================
    1    Michael    2023/12/20 根據 v1.0 重構
*/
BEGIN
  /* 目前支援下列 amis 元件(可依需求繼續擴充)
  select / options / options-add / checkboxes
  input-date / input-datetime / input-time
  input-number / input-password / formula
  picker
  radios
  switch
  checkbox
  static
  input-text
  textarea
  input-image
  input-file
  link-file
  link
  transfer
  mapping
  progress
  hidden
  uuid
  qr-code
  cycle-frequency / cycle-weeks / cycle-months / cycle-startdate / cycle-enddate
  */
  
  DECLARE v_FieldObject VARCHAR(100);
  DECLARE v_picker_tag VARCHAR(100);
  DECLARE v_FieldName VARCHAR(100);
  DECLARE v_FieldCN NVARCHAR(100);
  DECLARE v_FieldWidth VARCHAR(100);
  DECLARE v_fielddefault VARCHAR(200);
  DECLARE v_fieldro VARCHAR(10);
  DECLARE v_fieldfm VARCHAR(100);
  DECLARE v_FieldDS VARCHAR(1);
  DECLARE v_FieldSH VARCHAR(1);
  DECLARE v_FieldCheckNull VARCHAR(1);
  DECLARE v_iscolumnmatch VARCHAR(10);
  DECLARE v_FieldBlock INT;
  DECLARE v_group VARCHAR(10);
  DECLARE v_block VARCHAR(10);
  -- DECLARE v_y SMALLINT;
  DECLARE v_cnt INT;
  DECLARE v_imax INT;
  DECLARE v_imin INT;
  DECLARE v_inow INT;
  
  DECLARE v_required VARCHAR(100);
  DECLARE v_others VARCHAR(800);
  -- 有非 input-text 標準屬性設定的其他元件, 但又不是 4大特殊元件的元件(picker, cycle-, formula, transfer)
  SET v_others = 'input-file^input-image^textarea^select^input-date^input-datetime^options^options-add^mapping^progress^link-file^link^radios^';
  
  SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid;
  SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid;
  SET v_inow = v_imin;
  -- SET v_y = 1;
  
  WHILE v_inow <= v_imax DO
    SELECT 
      fieldname, IFNULL(fieldcn,fieldname), fieldwidth, fieldobject, fieldblock, picker_tag,
      IFNULL(fielddefault,''), IFNULL(fieldro,'N'), IFNULL(fieldfm,''),
      fieldds, fieldsh, fieldchecknull, iscolumnmatch, _group, _block
    INTO 
      v_FieldName, v_FieldCN, v_FieldWidth, v_FieldObject, v_FieldBlock, v_picker_tag,
      v_fielddefault, v_fieldro, v_fieldfm,
      v_FieldDS, v_FieldSH, v_FieldCheckNull, v_iscolumnmatch, v_group, v_block
    FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_inow;
    
    -- 防錯處理  
    IF v_FieldObject = 'Picker' AND IFNULL(v_picker_tag,'') = '' THEN
      SET v_FieldObject = 'input-text';
    END IF;

    -- 是否為必填
    SET v_required = '';
    IF v_FieldCheckNull = 'A' OR v_FieldCheckNull = 'Y' THEN
      SET v_required = '                    "required": true,';
    END IF;
  
    -- 加入簡易排版功能, type=block
    -- v2: block / group
    CALL zen_create_json_comps_block(p_uuid,p_FunctionTag,p_code_id,v_group,v_FieldBlock,v_block,v_inow);
    
    -- by 元件產生設定內容, 並寫入暫存
    IF v_FieldObject = 'formula' THEN
      CALL zen_create_json_comps_formula(p_uuid,v_FieldObject,v_FieldName,v_FieldCN,v_picker_tag,v_inow);
    ELSEIF v_FieldObject = 'picker' THEN
      CALL zen_create_json_comps_picker(p_uuid,p_FunctionTag,v_FieldName,v_FieldCN,v_picker_tag,p_pk,v_FieldCheckNull,v_inow);
    ELSEIF v_FieldObject = 'transfer' THEN
      CALL zen_create_json_comps_transfer(p_uuid,v_FieldName,v_FieldCN,v_picker_tag,p_code_id,v_inow);
    ELSEIF LOCATE('cycle-',v_FieldObject) > 0 THEN
      CALL zen_create_json_comps_cycles(p_uuid,v_FieldObject,v_FieldName,v_FieldCN,v_inow);
    ELSEIF v_FieldSH = 'Y' THEN
      CALL zen_create_json_comps_others(
        p_uuid,p_FunctionTag,p_code_id,v_FieldObject,p_tblName,p_pk,
        v_FieldName,v_FieldCN,v_fieldro,v_fielddefault,v_FieldDS,v_FieldSH,
        v_FieldCheckNull,v_required,p_query_type,v_picker_tag,v_fieldfm,v_inow
      );
    END IF;

    SET v_inow = v_inow + 1;
  END WHILE;
END //

DELIMITER ;