package com.casic.missiles.controller.user;

import com.casic.missiles.config.properties.CasicProperties;
import com.casic.missiles.core.shiro.ShiroKit;
import com.casic.missiles.core.util.RSAUtils;
import com.casic.missiles.dto.ReturnDTO;
import com.casic.missiles.dto.ReturnUtil;
import com.casic.missiles.dto.portal.RegisterUserDTO;
import com.casic.missiles.modular.interfaces.enums.ManagerStatus;
import com.casic.missiles.modular.system.service.IUserService;
import com.casic.missiles.redis.RedisUtil;
import com.casic.missiles.redis.key.CacheKeys;
import com.casic.missiles.utils.SMSUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.text.MessageFormat;
import java.util.Date;
import java.util.Objects;

/**
 * @Description: 门户网站用户相关
 * @Author: wangpeng
 * @Date: 2023/3/6 16:09
 */
//@Api(tags = "门户网站用户管理接口")
@Slf4j
@RestController
@RequestMapping("/portal/user")
public class UserController {
    @Autowired
    private CasicProperties casicProperties;
    @Autowired
    private IUserService userService;
    @Autowired
    private SMSUtil smsUtil;
    @Autowired
    private RedisUtil redisUtil;

    /**
     * 发送短信验证码
     */
//    @ApiOperation("门户网站注册验证码")
    @PostMapping("/sms/send/{phone}")
    @ResponseBody
    public ReturnDTO sendMsg(@PathVariable(name = "phone") String phone) {
        String key = MessageFormat.format(CacheKeys.SMS_TIMEOUT, phone);
        if (redisUtil.hasKey(key)) {
            return ReturnUtil.failed("不允许重复发送！");
        }
        String code = RandomStringUtils.randomNumeric(4);
        log.info("发送给手机号：{} 的验证码：{}", phone, code);
        smsUtil.sendMsg(phone, code);

        redisUtil.set(key, code, 60); //验证码验证期内设置
//        redisUtil.set(key, code, 20); //验证码重复设置
        return ReturnUtil.success("短信发送成功！");
    }

    /**
     * 注册
     * 每个客户只有一个用户可以注册（相当于该公司的管理员），该用户的登录后会在客户人员中添加公司信息及客户所在公司的其他用户信息，其他用户再注册就可以查该公司的信息
     * 填写手机号、密码、验证码注册，登录可通过手机号验证码或手机号密码
     * 查询时，根据用户手机号匹配客户人员的手机号，相同则可以获取该客户id，根据客户id获取数据
     * 可以用ATTR1存储类型（portal：门户网站，business：PC端计量系统），前端传类型查询，PC添加用户让前端写死ATTR1传PC，门户网站注册时后端写死传门户网站
     * 门户网站里的客户人员的部门、职务都是手填的
     * 计量人员可以登录门户网站，但是看不见数据
     * 基础包人员列表支持用ATTR1过滤查询
     */
//    @ApiOperation("门户网站用户注册")
    @PostMapping("/register")
    @ResponseBody
    public ReturnDTO userRegister(@RequestBody RegisterUserDTO user) {
        //验证码验证
        String key = MessageFormat.format(CacheKeys.SMS_TIMEOUT, user.getPhone());
        String verifyCode = String.valueOf(redisUtil.get(key));
        if(StringUtils.isEmpty(verifyCode)){
            return ReturnUtil.failed("验证码已过期！");
        }
        if(!verifyCode.equals(user.getVerifyCode())){
            return ReturnUtil.failed("验证码不正确！");
        }

        user.setAccount(casicProperties.getAccountPrefix().trim().concat(user.getAccount()));
        if(!Objects.isNull(userService.getByAccount(user.getPhone()))){
            return ReturnUtil.failed("该用户已经注册!");
        }
        try {
            user.setPassword(RSAUtils.decrypt(user.getPassword(), casicProperties.getRsaPrivateKey()));
        } catch (Exception var4) {
            log.error("密码解密异常：{}", var4);
            return ReturnUtil.failed("密码解密异常!");
        }
        user.setSalt(ShiroKit.getRandomSalt(5));
        user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt()));
        user.setStatus(ManagerStatus.OK.getCode());
        user.setCreateTime(new Date());
        user.setIsSync(0);
        //ATTR1为用户类型（portal：门户网站，business：PC端计量系统）
        user.setAttr1("portal");
        this.userService.save(user);
        return ReturnUtil.success();
    }
}
