DELIMITER //

CREATE OR REPLACE PROCEDURE checklogin(
  IN p_token VARCHAR(100),
  IN p_userid VARCHAR(100),
  IN p_pwd VARCHAR(200),
  IN p_logintype VARCHAR(10)  -- 由 app 或 web 或其他來源登入
)
/*
  Function   : 判斷能否 Login(前端登入時呼叫), 如果可以就傳回 Token
  Description: 判斷 Token 是否過期, 若未過期, 傳回 0, 已過期傳回 9, 密碼錯誤傳回 4
  Build Date : 2018/03/02
  
  Modify History
    Item Who        Date       Modify Docs
    ==== ========== ========== ================================================
    1    Michael    2018/01/08 開始改寫為 MySQL 版 
    2    Michael    2018-03-20 新增 isstop 帳號停用的判斷
    3    Michael    2018-03-26 回傳值改為 2個 dataset 傳回 code,msg,recno 後面才接 data 內容
    4    Michael    2022-11-26 新增 join 部門資料, 存在 localStoreage
    5    Michael    2023-02-04 新增 join 公司名稱, 存在 localStoreage
    
  Call Sample:
  CALL checklogin('token123', 'user01', 'password123', 'web');
*/
BEGIN
    DECLARE v_uuid VARCHAR(36);
    DECLARE v_lastlogintime DATETIME;
    DECLARE v_recno INT;
    DECLARE v_diffhour INT;
    DECLARE v_statuscode INT;
    DECLARE v_errMsg VARCHAR(200);
    DECLARE v_newtoken VARCHAR(100);
    DECLARE v_longday INT;  -- 0: token 永久有效 其他: token 的效期天數
    
    SET v_longday = 0;  -- token 預設永久有效
    SET v_statuscode = 9;
    SET v_errMsg = 'Token 過期或錯誤!';
    SET v_recno = 0;
    SET v_newtoken = '';
    
    -- 檢查 token 是否有效
    SELECT COUNT(*), MAX(lastlogintime) INTO v_recno, v_lastlogintime 
    FROM sys_users 
    WHERE userid = p_userid 
      AND IFNULL(isstop, '') <> 'Y' 
      AND IFNULL(token, 'null') = p_token
    GROUP BY token;
    
    IF v_recno > 0 THEN 
        SELECT TIMESTAMPDIFF(HOUR, v_lastlogintime, NOW()) INTO v_diffhour;
        IF v_diffhour >= 24*v_longday AND v_longday > 0 THEN
          SET v_statuscode = 9;
          SET v_errMsg = 'token 已過期，請重新登入!';
        ELSE
          SET v_statuscode = 0;
          SET v_errMsg = '登入成功!';
          SET v_newtoken = p_token;
        END IF;
    ELSE
        SET v_recno = 0;
        SELECT COUNT(*) INTO v_recno 
        FROM sys_users 
        WHERE userid = p_userid 
          AND IFNULL(isstop, '') <> 'Y' 
          AND IFNULL(pwd, '') = p_pwd;
        
        IF v_recno > 0 THEN 
            SET v_uuid = UUID();
            UPDATE sys_users SET token = v_uuid, lastlogintime=NOW() WHERE userid = p_userid;
            SET v_newtoken = v_uuid;
            SET v_statuscode = 0;
            SET v_errMsg = '登入成功!';
        ELSE
            SET v_statuscode = 4;
            SET v_errMsg = '帳號或密碼輸入錯誤!';
        END IF;
    END IF;
    
    -- 寫入 log(return error)
    CALL api_log(v_newtoken, v_errMsg);
    
    -- 回傳值 dataset[0], 前3個欄位有固定的內容
    SELECT v_statuscode AS code, v_errMsg AS msg, v_recno AS recno;
    
    -- 回傳值 dataset[1], 順便回傳 user info
    SELECT 
        u.*,
        d.departmentid,
        d.departmentcname,
        IFNULL(x.pvalue, 'Kylin Admin') AS corpname 
    FROM sys_users u
    LEFT JOIN basperson p ON p.personid = u.userid
    LEFT JOIN basdepartment d ON d.departmentid = p.departmentid
    LEFT JOIN sys_parameter x ON x.pid = 'corpname'
    WHERE IFNULL(u.token, 'null') = v_newtoken;
END//

DELIMITER ;