package com.ruoyi.fadapp.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.domain.dto.RoleDTO;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.DeviceType;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.redis.RedisUtils;
import com.ruoyi.fadapp.domain.vo.LoginResultVo;
import com.ruoyi.fadapp.domain.vo.NickDeptVo;
import com.ruoyi.fadapp.service.IFadAppAuthService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.SysPermissionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.util.List;
import java.util.ArrayList;

/**
 * FAD APP认证服务实现类
 *
 * @author ruoyi
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class FadAppAuthServiceImpl implements IFadAppAuthService {

    private final ISysUserService userService;
    private final SysPermissionService permissionService;

    /**
     * 验证码缓存前缀
     */
    private static final String CODE_PREFIX = "fadapp:code:";

    /**
     * 验证码过期时间（分钟）
     */
    private static final int CODE_EXPIRE_MINUTES = 5;

    /**
     * 固定验证码（开发环境使用）
     */
    private static final String FIXED_CODE = "666666";

    @Override
    public void sendCode(String phone) {
        // 验证手机号格式
        if (!phone.matches("^1[3-9]\\d{9}$")) {
            throw new ServiceException("手机号格式不正确");
        }

        // 生成验证码（开发环境使用固定验证码）
        String code = FIXED_CODE;
        
        // 存储验证码到Redis（5分钟过期）
        String key = CODE_PREFIX + phone;
        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(CODE_EXPIRE_MINUTES));

        // 记录日志（实际项目中这里会调用短信服务）
        log.info("向手机号 {} 发送验证码: {}", phone, code);
    }

    @Override
    public LoginResultVo loginByCode(String phone, String code) {
        // 验证手机号格式
        if (!phone.matches("^1[3-9]\\d{9}$")) {
            throw new ServiceException("手机号格式不正确");
        }

        // 验证验证码格式
        if (!code.matches("^\\d{6}$")) {
            throw new ServiceException("验证码格式不正确");
        }

        // 从Redis获取存储的验证码
        String key = CODE_PREFIX + phone;
        String storedCode = RedisUtils.getCacheObject(key);

        if (storedCode == null) {
            throw new ServiceException("验证码已过期，请重新获取");
        }

        if (!storedCode.equals(code)) {
            throw new ServiceException("验证码不正确");
        }

        // 验证码验证通过，删除Redis中的验证码
        RedisUtils.deleteObject(key);

        // 查找或创建用户
        SysUser user = findOrCreateUser(phone);

        // 构建登录用户信息
        LoginUser loginUser = buildLoginUser(user);
        
        // 使用原来的登录方式生成token
        LoginHelper.loginByDevice(loginUser, DeviceType.APP);
        String token = StpUtil.getTokenValue();

        // 构建登录结果
        LoginResultVo result = new LoginResultVo();
        result.setToken(token);
        result.setUserId(user.getUserId());
        result.setUserName(user.getUserName());
        result.setNickName(user.getNickName());
        result.setPhonenumber(user.getPhonenumber());
        result.setAvatar(user.getAvatar());
        result.setDeptId(user.getDeptId());
        result.setDeptName(user.getDept() != null ? user.getDept().getDeptName() : "");
        // 这里可以设置部门名称，需要查询部门信息
        return result;
    }

    @Override
    public void logout(String token) {
        // 清除token（这里可以根据实际使用的JWT库来实现）
        // 如果使用Sa-Token，可以调用 StpUtil.logout()
        StpUtil.logout();
    }

    /**
     * 查找或创建用户
     */
    private SysUser findOrCreateUser(String phone) {
        // 先查找用户
        SysUser user = userService.selectUserByPhonenumber(phone);
        
        if (user == null) {
//            // 用户不存在，创建新用户
//            user = new SysUser();
//            user.setUserName(phone); // 用户名使用手机号
//            user.setNickName("用户" + phone.substring(7)); // 昵称使用手机号后4位
//            user.setPhonenumber(phone);
//            user.setPassword("123456"); // 默认密码，实际项目中应该生成随机密码
//            user.setStatus("0"); // 正常状态
//
//            // 插入用户
//            userService.insertUser(user);
//
//            // 重新查询用户信息
//            user = userService.selectUserByPhonenumber(phone);
            //应该先报错
            throw new ServiceException("用户不存在");
        }

        return user;
    }

    /**
     * 构建登录用户
     */
//    private LoginUser buildLoginUser(SysUser user) {
//        LoginUser loginUser = new LoginUser();
//        loginUser.setUserId(user.getUserId());
//        loginUser.setDeptId(user.getDeptId());
//        loginUser.setUsername(user.getUserName());
//        loginUser.setNickName(user.getNickName());
//        loginUser.setUserType(user.getUserType());
//        loginUser.setMenuPermission(permissionService.getMenuPermission(user));
//        loginUser.setRolePermission(permissionService.getRolePermission(user));
//        loginUser.setDeptName(user.getDept() != null ? user.getDept().getDeptName() : "");
//        return loginUser;
//    }
    private LoginUser buildLoginUser(SysUser user) {
        LoginUser loginUser = new LoginUser();
        loginUser.setUserId(user.getUserId());
        loginUser.setDeptId(user.getDeptId());
        loginUser.setUsername(user.getUserName());
        loginUser.setNickName(user.getNickName());
        loginUser.setUserType(user.getUserType());
        loginUser.setMenuPermission(permissionService.getMenuPermission(user));
        loginUser.setRolePermission(permissionService.getRolePermission(user));
        loginUser.setDeptName(ObjectUtil.isNull(user.getDept()) ? "" : user.getDept().getDeptName());
        List<RoleDTO> roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class);
        loginUser.setRoles(roles);
        return loginUser;
    }

    @Override
    public String getDeptNameByUserName(String userName) {
        SysUser user = userService.selectUserByUserName(userName);
        if (user == null) {
            throw new ServiceException("用户不存在");
        }
        if (user.getDept() != null) {
            return user.getDept().getDeptName();
        }
        return "";
    }

    @Override
    public String getDeptNameByNickName(String nickName) {
        SysUser user = userService.selectUserByNickName(nickName);
        if (user == null) {
            throw new ServiceException("用户不存在");
        }
        if (user.getDept() != null) {
            return user.getDept().getDeptName();
        }
        return "";
    }

    @Override
    public List<NickDeptVo> getDeptNamesByNickNames(List<String> nickNames) {
        List<NickDeptVo> result = new ArrayList<>();
        for (String nick : nickNames) {
            SysUser user = userService.selectUserByNickName(nick);
            NickDeptVo vo = new NickDeptVo();
            vo.setNickName(nick);
            if (user != null && user.getDept() != null) {
                vo.setDeptName(user.getDept().getDeptName());
            } else {
                vo.setDeptName("");
            }
            result.add(vo);
        }
        return result;
    }
} 