DELIMITER //

CREATE PROCEDURE zen_sync_base_security(
  IN p_token VARCHAR(100),
  IN p_functiontag VARCHAR(100)
)
/*
  Function   : 在單一資料庫的架構下, 在 Wizard 產生程式後, 直接同步 menu 及基本權限設定
  Description: 目的是產生程式後, 就可以直接在測試環境執行
  Build Date : 2023-12-10
  
  Modify History
    Item Who        Date       Modify Docs
    ==== ========== ========== ================================================
    1    Michael    2023-12-10 改寫為 MySQL 版
	
*/
BEGIN
  DECLARE parenttag VARCHAR(100);
  DECLARE cnt INT;
  DECLARE user_id VARCHAR(100);
  DECLARE err_code SMALLINT;
  DECLARE err_msg NVARCHAR(100);

  SET err_code = 0;
  SET err_msg = '選單及權限設定成功 !!';

  SELECT userid INTO user_id FROM sys_users WHERE token = p_token;

  IF COALESCE(user_id, '') = '' THEN
    SET err_code = 4;
    SET err_msg = '原密碼輸入錯誤, 請重新輸入';
  ELSE
    -- step 1: 先判斷是否是單一 db 架構
    -- if EXISTS (SELECT * FROM information_schema.tables WHERE table_name = 'sys_menutable') 
    IF 1 = 1 THEN -- 利用同義字(Synonym) 解決括資料庫問題 20230823 Michael
      -- step 2: 根據 zen_function 寫入 menu
      -- 如果 parent_menuid 不存在, 要一併自動產生
      SELECT parenttag INTO parenttag FROM zen_function WHERE functiontag = p_functiontag;
      IF COALESCE(parenttag, '') = '' THEN
        SET parenttag = '';
      END IF;

      SELECT COUNT(*) INTO cnt FROM sys_menutable WHERE menuid = parenttag AND parenttag <> '';
      IF cnt = 0 THEN
        INSERT INTO sys_menutable (menuid, parent_menuid, caption, moduleid, seq_no, owned)
        SELECT parenttag, '', functionname + '(目錄)', projectid, functiontag, '00' FROM zen_function WHERE functiontag = p_functiontag;

        INSERT INTO sys_rolemenusecurity (roleid, menuid, controlname)
        SELECT '00', p_functiontag, 'read';
      END IF;

      SELECT COUNT(*) INTO cnt FROM sys_menutable WHERE menuid = p_functiontag;
      IF cnt = 0 THEN
        INSERT INTO sys_menutable (menuid, parent_menuid, caption, moduleid, seq_no, owned)
        SELECT functiontag, parenttag, functionname, projectid, functiontag, '00' FROM zen_function WHERE functiontag = p_functiontag;
      END IF;

      -- step 3: 根據 zen_fields 寫入 security
      SELECT COUNT(*) INTO cnt FROM sys_rolemenusecurity WHERE menuid = p_functiontag;
      IF cnt = 0 THEN
        INSERT INTO sys_rolemenusecurity (roleid, menuid, controlname)
        SELECT '00', p_functiontag, 'read'
        UNION
        SELECT '00', p_functiontag, 'insert'
        UNION
        SELECT '00', p_functiontag, 'update'
        UNION
        SELECT '00', p_functiontag, 'delete';
      END IF;
    ELSE
      SET err_code = 9;
      SET err_msg = '必須是單一資料庫架構才能執行 !!';
    END IF;
  END IF;

  SELECT err_code AS code, err_msg AS msg;
  
END //

DELIMITER ;
