-- ============================================================
-- app_user 表结构修复与字段扩展
-- 用途：支持手机号 + 微信小程序登录，补充常用用户字段
-- ============================================================

-- 通用 helper：列不存在时才添加
DROP PROCEDURE IF EXISTS add_app_user_column;
DELIMITER $$
CREATE PROCEDURE add_app_user_column(
    IN col_name VARCHAR(64),
    IN col_def  VARCHAR(256)
)
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE()
          AND TABLE_NAME   = 'app_user'
          AND COLUMN_NAME  = col_name
    ) THEN
        SET @sql = CONCAT('ALTER TABLE app_user ADD COLUMN ', col_name, ' ', col_def);
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END IF;
END$$
DELIMITER ;

-- 1. 补充原缺失的 username 列（注册/认证需要）
CALL add_app_user_column('username', 'VARCHAR(64) COMMENT ''用户名'' AFTER id');

-- 2. 补充 BaseEntity 审计/逻辑删除列（MyBatis-Plus 自动填充与逻辑删除依赖）
CALL add_app_user_column('is_deleted',    'TINYINT NOT NULL DEFAULT 0 COMMENT ''逻辑删除(0-否 1-是)'' AFTER status');
CALL add_app_user_column('create_time',   'DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ''创建时间'' AFTER is_deleted');
CALL add_app_user_column('update_time',   'DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ''更新时间'' AFTER create_time');
CALL add_app_user_column('create_by',     'BIGINT DEFAULT NULL COMMENT ''创建人'' AFTER update_time');
CALL add_app_user_column('update_by',     'BIGINT DEFAULT NULL COMMENT ''更新人'' AFTER create_by');

-- 3. 微信小程序登录相关字段
CALL add_app_user_column('unionid',          'VARCHAR(64) DEFAULT NULL COMMENT ''微信unionid'' AFTER wechat_openid');
CALL add_app_user_column('session_key',      'VARCHAR(128) DEFAULT NULL COMMENT ''微信小程序session_key'' AFTER unionid');
CALL add_app_user_column('register_source',  'TINYINT DEFAULT 1 COMMENT ''注册来源(1-手机号 2-微信小程序)'' AFTER session_key');

-- 4. 常用用户字段
CALL add_app_user_column('birthday',         'DATE DEFAULT NULL COMMENT ''生日'' AFTER register_source');
CALL add_app_user_column('last_login_time',  'DATETIME DEFAULT NULL COMMENT ''最后登录时间'' AFTER birthday');

DROP PROCEDURE IF EXISTS add_app_user_column;

-- 5. 删除多余的 user_id 列
--    实体 ClientUser 主键为 BaseEntity.id（列名 id），代码中 userId 均由 "id AS userId" 映射而来，
--    表内遗留的 user_id 列（NOT NULL 无默认值）导致 INSERT 未写该列时报 "Field 'user_id' doesn't have a default value"。
--    该列未被任何代码引用，直接删除以消除冗余。
SET @col_exists = (
    SELECT COUNT(*) FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME = 'app_user'
      AND COLUMN_NAME = 'user_id'
);
SET @sql = IF(
    @col_exists > 0,
    'ALTER TABLE app_user DROP COLUMN user_id',
    'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- 6. 扩大 password 列，BCrypt 加密后固定 60 字符，原 VARCHAR(32) 会触发 Data too long
ALTER TABLE app_user MODIFY COLUMN password VARCHAR(100) NOT NULL COMMENT '密码(加密)';

-- 7. 扩大 sys_log.error_msg，避免长异常信息被截断
ALTER TABLE sys_log MODIFY COLUMN error_msg VARCHAR(2000) COMMENT '错误信息';
