DELIMITER //

CREATE PROCEDURE zen_parse_sp(
  IN actiontype VARCHAR(10),  -- fields/parain
  IN sp_name VARCHAR(200),
  IN functiontag VARCHAR(200)
)
/*
  function   : 想辦法取得 sp 最後回傳的欄位名稱列表
  description: 有跨 db 的語法, 記得測試完後要移除
  build date : 2021/12/02
  
  call sample:
  CALL zen_parse_sp('gexrpt_opor02');
  
  modify history
    item who        date       modify docs
    ==== ========== ========== ================================================
    1    michael    2021/12/02 新增
*/
BEGIN
  DECLARE sql_text TEXT;
  DECLARE data_text TEXT;
  DECLARE pos INT;
  DECLARE ret2_col VARCHAR(100);
  DECLARE ret2_fieldobject VARCHAR(100);
  DECLARE ret2_related_provider VARCHAR(100);
  DECLARE ret2_default_value VARCHAR(100);
  DECLARE ret2_celly SMALLINT;
  DECLARE ret2_seqno INT;
  DECLARE ret2_rowid INT;

  SELECT text INTO sql_text
  FROM information_schema.routines
  WHERE routine_name = sp_name AND routine_type = 'PROCEDURE';
	  
  -- 回傳的欄位	  
  IF actiontype = 'fields' THEN
    SELECT 0 AS code, 'ok' AS msg;
    
    CREATE TEMPORARY TABLE ret2 AS
    SELECT
      functiontag,
      column_name AS fieldname,
      column_name AS fieldcn,
      CASE WHEN LOCATE('date', data_type) > 0 THEN 'static-date' ELSE 'static' END AS fieldobject,
      ordinal_position AS seqno
    FROM information_schema.columns
    WHERE table_schema = DATABASE() AND table_name = sp_name;

    SELECT * FROM ret2;

  -- 傳入的參數
  ELSEIF actiontype = 'parain' THEN
    -- 取得 () 內的資料	  
    SET pos = LOCATE('/*', sql_text);
    IF pos > 0 THEN
      SET sql_text = SUBSTRING(sql_text, 1, pos - 5);
    END IF;
    
    SET pos = LOCATE('as', sql_text);	  
    IF pos > 0 THEN
      SET sql_text = SUBSTRING(sql_text, 1, pos - 5);
    END IF;
    
    SET pos = LOCATE('(', sql_text);
    SET data_text = SUBSTRING(sql_text, pos + 1, LENGTH(sql_text));
    
    CREATE TEMPORARY TABLE ret2 (
      col VARCHAR(100),
      fieldobject VARCHAR(100),
      related_provider VARCHAR(100),
      default_value VARCHAR(100),
      celly SMALLINT,
      rowid INT AUTO_INCREMENT,
      PRIMARY KEY (rowid)
    );

    -- 開始分析(, 分隔)
    INSERT INTO ret2 (col)
    SELECT col FROM gf_split(data_text, ',');

    UPDATE ret2 SET col = SUBSTRING(col, LOCATE('@', col), LENGTH(col)); 
    UPDATE ret2 SET col = SUBSTRING(col, 1, LOCATE(' ', col) - 1); 
    
    -- 想辦法給定一些 default
    UPDATE ret2 SET fieldobject = 'input-text', default_value = '*';

    UPDATE ret2 SET
      fieldobject = 'input-date',
      default_value = 'today'
    WHERE LOCATE('date', col) > 0;

    UPDATE ret2 SET
      fieldobject = 'picker',
      related_provider = 'basm61'
    WHERE LOCATE('cust', col) > 0;

    UPDATE ret2 SET
      fieldobject = 'picker',
      related_provider = 'basm51'
    WHERE LOCATE('product', col) > 0;

    UPDATE ret2 SET
      fieldobject = 'picker',
      related_provider = 'basm67'
    WHERE LOCATE('person', col) > 0;

    -- 如果第一個 para 是 token
    SELECT COUNT(*) INTO pos FROM ret2 WHERE rowid = 1 AND LOCATE('token', col) > 0;
    IF pos > 0 THEN
      UPDATE ret2 SET default_value = '${ls:token}' WHERE LOCATE('token', col) > 0;
    END IF;

    SELECT 0 AS code, 'ok' AS msg;

    SELECT functiontag, col AS fcaption, 1 AS celly, rowid - pos AS seqno, fieldobject, related_provider, default_value
    FROM ret2;

  END IF;
  
END //

DELIMITER ;
