package shop.alien.storeplatform.example;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import shop.alien.entity.store.StoreUser;
import shop.alien.storeplatform.util.LoginUserUtil;

/**
 * LoginUserUtil 工具类使用示例
 * 
 * 本类展示了如何在实际项目中使用 LoginUserUtil 工具类
 * 注意：这只是一个示例类，实际使用时可以直接在Service或Controller中调用
 *
 * @author ssk
 * @since 2025-11-17
 */
@Slf4j
public class LoginUserUtilExample {

    /**
     * 示例1: 获取当前用户的基本信息（从Token）
     */
    public void example1_GetBasicInfo() {
        log.info("========== 示例1: 获取基本信息 ==========");
        
        // 获取用户ID
        Integer userId = LoginUserUtil.getCurrentUserId();
        log.info("用户ID: {}", userId);
        
        // 获取手机号
        String phone = LoginUserUtil.getCurrentUserPhone();
        log.info("手机号: {}", phone);
        
        // 获取用户类型
        String userType = LoginUserUtil.getCurrentUserType();
        log.info("用户类型: {}", userType);
        
        // 获取完整Token信息
        JSONObject userInfo = LoginUserUtil.getCurrentUserInfo();
        log.info("完整用户信息: {}", userInfo);
    }

    /**
     * 示例2: 获取完整用户信息（从数据库）
     */
    public void example2_GetCompleteInfo() {
        log.info("========== 示例2: 获取完整用户信息 ==========");
        
        StoreUser storeUser = LoginUserUtil.getCurrentStoreUser();
        if (storeUser != null) {
            log.info("用户ID: {}", storeUser.getId());
            log.info("手机号: {}", storeUser.getPhone());
            log.info("昵称: {}", storeUser.getNickName());
            log.info("真实姓名: {}", storeUser.getName());
            log.info("身份证号: {}", storeUser.getIdCard());
            log.info("门店ID: {}", storeUser.getStoreId());
            log.info("账户余额: {}", storeUser.getMoney());
            log.info("头像: {}", storeUser.getHeadImg());
            log.info("账号简介: {}", storeUser.getAccountBlurb());
        } else {
            log.warn("用户未登录或查询失败");
        }
    }

    /**
     * 示例3: 验证用户登录状态
     */
    public void example3_CheckLoginStatus() {
        log.info("========== 示例3: 验证登录状态 ==========");
        
        // 检查是否登录
        if (LoginUserUtil.isLogin()) {
            log.info("用户已登录");
        } else {
            log.info("用户未登录");
        }
        
        // 检查是否为商户平台用户
        if (LoginUserUtil.isStorePlatformUser()) {
            log.info("是商户平台用户");
        } else {
            log.info("不是商户平台用户");
        }
    }

    /**
     * 示例4: 验证是否为当前用户（权限控制）
     */
    public void example4_CheckCurrentUser() {
        log.info("========== 示例4: 验证是否为当前用户 ==========");
        
        Integer targetUserId = 12345; // 要操作的目标用户ID
        
        if (LoginUserUtil.isCurrentUser(targetUserId)) {
            log.info("是当前用户，允许操作");
            // 执行业务逻辑
        } else {
            log.warn("不是当前用户，拒绝操作");
            // 抛出异常或返回错误
        }
    }

    /**
     * 示例5: 获取便捷字段
     */
    public void example5_GetConvenientFields() {
        log.info("========== 示例5: 获取便捷字段 ==========");
        
        // 获取门店ID
        Integer storeId = LoginUserUtil.getCurrentStoreId();
        log.info("门店ID: {}", storeId);
        
        // 获取昵称
        String nickName = LoginUserUtil.getCurrentNickName();
        log.info("昵称: {}", nickName);
        
        // 获取真实姓名
        String name = LoginUserUtil.getCurrentName();
        log.info("真实姓名: {}", name);
    }

    /**
     * 示例6: 在Service中使用（自动填充用户信息）
     */
    public void example6_UseInService() {
        log.info("========== 示例6: 在Service中使用 ==========");
        
        // 场景：创建订单时自动填充当前用户信息
        Integer userId = LoginUserUtil.getCurrentUserId();
        Integer storeId = LoginUserUtil.getCurrentStoreId();
        
        if (userId == null || storeId == null) {
            log.error("用户未登录或无门店信息");
            return;
        }
        
        // 模拟创建订单
        log.info("创建订单 - 用户ID: {}, 门店ID: {}", userId, storeId);
        // Order order = new Order();
        // order.setUserId(userId);
        // order.setStoreId(storeId);
        // orderService.createOrder(order);
    }

    /**
     * 示例7: 安全的空值处理
     */
    public void example7_SafeNullHandling() {
        log.info("========== 示例7: 安全的空值处理 ==========");
        
        // 方式1: 直接判空
        Integer userId = LoginUserUtil.getCurrentUserId();
        if (userId != null) {
            log.info("用户ID: {}", userId);
        } else {
            log.warn("用户未登录");
        }
        
        // 方式2: 使用 isLogin() 先判断
        if (LoginUserUtil.isLogin()) {
            Integer id = LoginUserUtil.getCurrentUserId();
            log.info("已登录，用户ID: {}", id);
        } else {
            log.warn("用户未登录");
        }
    }

    /**
     * 示例8: 权限验证（只能修改自己的数据）
     */
    public boolean example8_PermissionCheck(Integer targetUserId) {
        log.info("========== 示例8: 权限验证 ==========");
        
        // 验证用户只能修改自己的数据
        if (!LoginUserUtil.isCurrentUser(targetUserId)) {
            log.error("权限不足：用户 {} 尝试修改用户 {} 的数据", 
                    LoginUserUtil.getCurrentUserId(), targetUserId);
            throw new RuntimeException("您只能修改自己的信息");
        }
        
        log.info("权限验证通过");
        return true;
    }

    /**
     * 示例9: 记录操作日志
     */
    public void example9_LogOperation(String action, String details) {
        log.info("========== 示例9: 记录操作日志 ==========");
        
        // 获取当前用户信息用于日志记录
        Integer userId = LoginUserUtil.getCurrentUserId();
        String phone = LoginUserUtil.getCurrentUserPhone();
        String name = LoginUserUtil.getCurrentName();
        
        // 记录操作日志
        log.info("操作日志 - 用户ID: {}, 手机号: {}, 姓名: {}, 操作: {}, 详情: {}", 
                userId, phone, name, action, details);
        
        // 实际项目中可以保存到数据库
        // AuditLog auditLog = new AuditLog();
        // auditLog.setUserId(userId);
        // auditLog.setUserPhone(phone);
        // auditLog.setUserName(name);
        // auditLog.setAction(action);
        // auditLog.setDetails(details);
        // auditLog.setOperateTime(new Date());
        // auditLogMapper.insert(auditLog);
    }

    /**
     * 示例10: 性能优化（缓存用户信息）
     */
    public void example10_CacheUserInfo() {
        log.info("========== 示例10: 性能优化 ==========");
        
        // 一次性获取完整用户信息并缓存
        StoreUser storeUser = LoginUserUtil.getCurrentStoreUser();
        
        if (storeUser != null) {
            // 后续使用缓存的对象，避免重复查询数据库
            Integer userId = storeUser.getId();
            Integer storeId = storeUser.getStoreId();
            String nickName = storeUser.getNickName();
            
            log.info("使用缓存 - 用户ID: {}, 门店ID: {}, 昵称: {}", 
                    userId, storeId, nickName);
            
            // ❌ 不推荐：多次调用查询数据库的方法
            // Integer storeId1 = LoginUserUtil.getCurrentStoreId();
            // String nickName1 = LoginUserUtil.getCurrentNickName();
            // String name1 = LoginUserUtil.getCurrentName();
        }
    }

    /**
     * 主方法：运行所有示例
     */
    public static void main(String[] args) {
        LoginUserUtilExample example = new LoginUserUtilExample();
        
        // 注意：实际运行需要在Spring容器中，且用户已登录
        example.example1_GetBasicInfo();
        example.example2_GetCompleteInfo();
        example.example3_CheckLoginStatus();
        example.example4_CheckCurrentUser();
        example.example5_GetConvenientFields();
        example.example6_UseInService();
        example.example7_SafeNullHandling();
        example.example9_LogOperation("更新用户信息", "修改昵称和头���");
        example.example10_CacheUserInfo();
    }
}







