package com.example.his.api.front.service;

import cn.hutool.core.util.RandomUtil;
import com.example.his.api.db.dao.CustomerDao;
import com.example.his.api.db.dao.OrderDao;
import com.example.his.api.db.pojo.CustomerEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service("FrontCustomerServiceImpl")
@Slf4j
public class CustomerService {
    @Resource
    private RedisTemplate redisTemplate;

    @Resource
    private CustomerDao customerDao;

    @Resource
    private OrderDao orderDao;

    // 短信验证码
    public HashMap sendSmsCode(String tel) {
        // 生成随机6位数字
        String code = RandomUtil.randomNumbers(6);
        System.out.println(code);

        String key = "sms_code_refresh_" + tel;
        // 判断现在是否禁止向某个电话号码发送短信验证码
        if (redisTemplate.hasKey(key)) {
            return new HashMap(){{
                put("result", "禁止重复发送短信验证码");
                put("code", "");
            }};
        }

        // 创建禁止重新发送短信验证码的缓存
        redisTemplate.opsForValue().set(key, code);
        redisTemplate.expire(key, 2, TimeUnit.MINUTES);

        // 把数字和电话号码缓存到Redis，并且设置过期时间
        key = "sms_code_" + tel;
        redisTemplate.opsForValue().set(key, code);
        redisTemplate.expire(key, 5, TimeUnit.MINUTES);

        return new HashMap(){{
            put("result", "短信验证码已发送");
            put("code", code);
        }};
    }

    // 客户登录
    @Transactional
    public HashMap login(String tel, String code) {
        HashMap map = new HashMap();

        // 核对短信验证码和电话号码
        String key = "sms_code_" + tel;

        if (!redisTemplate.hasKey(key)) {
            map.put("result", false);
            map.put("msg", "短信验证码已过期请重新发送");
            return map;
        }

        String cacheCode = redisTemplate.opsForValue().get(key).toString();

        if (!cacheCode.equals(code)) {
            map.put("result", false);
            map.put("msg", "短信验证码不正确");
            return map;
        }

        redisTemplate.delete(key);
        key = "sms_code_refresh_" + tel;
        redisTemplate.delete(key);

            Integer id = customerDao.searchCustomerById(tel);

        // 判断是不是新用户
        if (id == null) {
            CustomerEntity entity = new CustomerEntity();
            entity.setTel(tel);
            //注册新用户
            customerDao.insertCustomer(entity);
            id = customerDao.searchCustomerById(tel);
        }

        map.put("id", id);
        map.put("result", true);
        map.put("msg", "登陆成功");
        return map;
    }

    // 客户查询
    public HashMap searchCustomer(Map param) {
        return customerDao.searchCustomer(param);
    }

    // 客户更新
    public int updateCustomer(Map param) {
        return customerDao.updateCustomer(param);
    }

    // 订单统计数据
    public HashMap searchSummary(Map param) {
        return orderDao.searchSummary(param);
    }
}
