DELIMITER //

CREATE OR REPLACE PROCEDURE zen_sync_base_security (
    IN p_token VARCHAR(100),
    IN p_functiontag VARCHAR(100)
)
/*
  Function   : 在單一資料庫的架構下, 在 Wizard 產生程式後, 直接同步 menu 及基本權限設定
  Description: 目的是產生程式後, 就可以直接在測試環境執行
  Build Date : 2023/08/04
  
  Modify History
    Item Who        Date       Modify Docs
    ==== ========== ========== ================================================
	1    Michael    2026-03-10 Init 重新用 Gemini 改寫(舊版有誤)

*/
BEGIN
    -- 變數宣告必須放在最前面 
    DECLARE v_parenttag VARCHAR(100);
    DECLARE v_cnt INT;
    DECLARE v_userid VARCHAR(100);
    DECLARE v_err_code SMALLINT DEFAULT 0;
    DECLARE v_err_msg NVARCHAR(100) DEFAULT '選單及權限設定成功 !!';

    -- Step 1: 驗證使用者身份 [cite: 2]
    SELECT userid INTO v_userid FROM sys_users WHERE token = p_token LIMIT 1;

    IF IFNULL(v_userid, '') = '' THEN
        SET v_err_code = 4;
        SET v_err_msg = '原密碼輸入錯誤, 請重新輸入';
    ELSE
        -- Step 2: 根據 zen_function 寫入 menu [cite: 3]
        -- 獲取父節點標籤
        SELECT IFNULL(parenttag, '') INTO v_parenttag 
        FROM zen_function 
        WHERE functiontag = p_functiontag LIMIT 1;

        IF IFNULL(v_parenttag, '') = '' THEN 
            SET v_parenttag = ''; 
        END IF;

        -- 如果 parent_menuid 不存在，則自動產生 [cite: 4, 5]
        SELECT COUNT(*) INTO v_cnt 
        FROM sys_menutable 
        WHERE menuid = v_parenttag AND v_parenttag <> '';

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

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

        -- 檢查並插入目前的 functiontag 選單 [cite: 7, 8]
        SELECT COUNT(*) INTO v_cnt FROM sys_menutable WHERE menuid = p_functiontag;
        
        IF v_cnt = 0 THEN
            INSERT INTO sys_menutable (menuid, parent_menuid, caption, moduleid, seq_no, owned)
            SELECT functiontag, v_parenttag, functionname, projectid, functiontag, '00' 
            FROM zen_function 
            WHERE functiontag = p_functiontag;
        END IF;

        -- Step 3: 根據 zen_fields 寫入基本權限 (read, insert, update, delete) [cite: 9, 10]
        SELECT COUNT(*) INTO v_cnt FROM sys_rolemenusecurity WHERE menuid = p_functiontag;

        IF v_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;
    END IF;

    -- 回傳執行結果 [cite: 11]
    SELECT v_err_code AS code, v_err_msg AS msg;

END //

DELIMITER ;