DELIMITER //

CREATE OR REPLACE PROCEDURE zen_create_json_prepare_detaildata(
  IN p_uuid VARCHAR(100),
  IN p_FunctionTag VARCHAR(100),
  IN p_code_id VARCHAR(100),
  IN p_detail_table VARCHAR(100),
  IN p_detail_key VARCHAR(100),
  IN p_detail_sort_fieldname VARCHAR(100),
  IN p_query_type VARCHAR(1)
)
/*
  功能   : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義)
  描述: 本段 sp 主要是設定 master-detail 中 detail 相關的 json 定義
  建立日期 : 2023/12/20
  
  修改歷史
    項目 誰         日期       修改說明
    ==== ========== ========== ================================================
    1    Michael    2023/12/20 根據 v1.0 重構
*/
BEGIN
  DECLARE v_uuid_d VARCHAR(100);
  DECLARE v_detail_fields VARCHAR(800);
  DECLARE v_GridFooter_Sum VARCHAR(2000);
  DECLARE v_is_footer_sum VARCHAR(1);
  DECLARE v_grid_footer_sum VARCHAR(2000);
  DECLARE v_first_formula_in INT;
  DECLARE v_pos INT;
  DECLARE v_imax INT;
  DECLARE v_imin INT;
  DECLARE v_crlf VARCHAR(2);
  DECLARE v_lastsep VARCHAR(1);
  DECLARE v_comps TEXT;
  DECLARE v_db VARCHAR(200);
  DECLARE v_ip VARCHAR(200);
  DECLARE v_query_type_data TEXT;
  DECLARE v_keyword_search VARCHAR(600);
  DECLARE v_fieldname VARCHAR(100);
  DECLARE v_rowid INT;

  SET v_crlf = CONCAT(CHAR(13), CHAR(10));
  SET v_ip = '${ls:base_ip}';
  SET v_db = '${ls:base_db}';

  /*
    建立臨時表儲存 detail 欄位資訊
  */
  CREATE TEMPORARY TABLE IF NOT EXISTS tmp_default3 (
    fieldname VARCHAR(100),
    is_footer_sum VARCHAR(1),
    rowid INT AUTO_INCREMENT PRIMARY KEY
  );
  
  TRUNCATE TABLE tmp_default3;
  
  -- 取得 detail 的欄位名稱(要包含 pk 欄位)
  INSERT INTO tmp_default3 (fieldname, is_footer_sum)
  SELECT fieldname, is_footer_sum
  FROM zen_fields 
  WHERE functiontag = p_functiontag and fieldblock >= 90 and fieldsh = 'Y'
  ORDER BY seqno;
  
  SET v_detail_fields = '';
  SET v_GridFooter_Sum = '';
  SET v_grid_footer_sum = '';
  SET v_pos = 0;
  
  SELECT MAX(rowid) INTO v_imax FROM tmp_default3;
  SELECT MIN(rowid) INTO v_imin FROM tmp_default3;
  
  WHILE v_imin <= v_imax DO
    SELECT fieldname, is_footer_sum INTO v_fieldname, v_is_footer_sum 
    FROM tmp_default3 WHERE rowid = v_imin;
    
    IF v_imin = v_imax THEN 
      SET v_lastsep = ''; 
    ELSE 
      SET v_lastsep = ','; 
    END IF;
    
    SET v_detail_fields = CONCAT(v_detail_fields, v_fieldname, v_lastsep);
    
    -- 加入 grid_footer_sum 的判斷
    SET v_pos = v_pos + 1;
    IF v_is_footer_sum = 'Y' THEN
      IF v_grid_footer_sum = '' THEN
        SET v_grid_footer_sum = CONCAT(
          '                    {', v_crlf,
          '                      "type": "text",', v_crlf,
          '                      "text": "合計",', v_crlf,
          '                      "className": "right-10",', v_crlf,
          '                      "colSpan": ', CAST(v_pos-1 AS CHAR), v_crlf,
          '                    },', v_crlf,
          '                    {', v_crlf,
          '                      "type": "tpl",', v_crlf,
          '                      "tpl": "${details|pick:',v_fieldname,'|sum}"', v_crlf,
          '                    },', v_crlf);
      ELSE
        SET v_grid_footer_sum = CONCAT(v_grid_footer_sum,
          '                    {', v_crlf,
          '                      "type": "tpl",', v_crlf,
          '                      "tpl": "${details|pick:',v_fieldname,'|sum}"', v_crlf,
          '                    },', v_crlf);
      END IF;
    END IF;

    SELECT MIN(rowid) INTO v_imin FROM tmp_default3 WHERE rowid > v_imin;
  END WHILE;
  
  DROP TEMPORARY TABLE IF EXISTS tmp_default3;
  
  IF v_grid_footer_sum <> '' THEN
    SET v_grid_footer_sum = CONCAT(SUBSTRING(v_grid_footer_sum,1,LENGTH(v_grid_footer_sum)-3), v_crlf);
    
    SET v_GridFooter_Sum = CONCAT(',', v_crlf, 
                         '"affixRow": [', v_crlf,
                         v_grid_footer_sum,
                         '                  ]', v_crlf);
  END IF;
  
  -- 將傳入的 json 寫入暫存表方便處理
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'Sub_TableName',IFNULL(p_detail_table,''),NOW());
  -- MD 中 uuid template 的 d 檔暫存檔(目前先 hard code) Michael 20240319
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'Sub_TableName_x',REPLACE(IFNULL(p_detail_table,''),'_d','_x'),NOW());
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'Sub_pk',IFNULL(p_detail_key,''),NOW());
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'seqno',IFNULL(p_detail_sort_fieldname,''),NOW());
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'GridFooter_Sum',IFNULL(v_GridFooter_Sum,''),NOW());
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'detail_fields',IFNULL(v_detail_fields,''),NOW());
  
  -- Master-detail 的 detail
  IF SUBSTRING(p_code_id,1,12) = 'MasterDetail' THEN
    SET v_uuid_d = UUID();
    
    -- v2: 將主要的 dataset 整理後寫入 
    CALL zen_create_json_prepare_ds('D',v_uuid_d,p_FunctionTag);
    
    -- v2: kernel compoment
    CALL zen_create_json_kernel(v_uuid_d,p_FunctionTag,p_detail_table,p_detail_key,p_query_type,p_code_id);
    
    -- v2: 寫入暫存表的3個變數(部分參考 final 的寫法)
    CALL zen_create_json_detail(v_uuid_d,p_uuid,p_FunctionTag,p_code_id,p_detail_key);
  END IF;
END //

DELIMITER ;