package com.fs.company.service.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fs.common.annotation.RepeatSubmit;
import com.fs.common.core.domain.R;
import com.fs.common.exception.CustomException;
import com.fs.company.domain.*;
import com.fs.company.dto.CompBuySmsDTO;
import com.fs.company.mapper.*;
import com.fs.company.vo.CompanySmsListVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.util.Asserts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fs.company.service.ICompanySmsService;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 公司短信Service业务层处理
 *
 * @author fs
 * @date 2023-01-09
 */
@Slf4j
@Service
public class CompanySmsServiceImpl implements ICompanySmsService
{
    @Autowired
    private CompanySmsMapper companySmsMapper;

    @Autowired
    private CompanyMapper companyMapper;

    @Autowired
    private CompanySmsPackageMapper companySmsPackageMapper;

    @Autowired
    private CompanySmsOrderMapper companySmsOrderMapper;

    @Autowired
    private CompanyMoneyLogsMapper companyMoneyLogsMapper;
    /**
     * 查询公司短信
     *
     * @param smsId 公司短信ID
     * @return 公司短信
     */
    @Override
    public CompanySms selectCompanySmsById(Long smsId)
    {
        return companySmsMapper.selectCompanySmsById(smsId);
    }

    /**
     * 查询公司短信列表
     *
     * @param companySms 公司短信
     * @return 公司短信
     */
    @Override
    public List<CompanySmsListVO> selectCompanySmsList(CompanySms companySms)
    {
        List<CompanySmsListVO> list = companySmsMapper.selectCompanySmsList(companySms);
        for (CompanySmsListVO vo : list){
            vo.setSuccessSmsCount(companySmsMapper.successSmsCount(vo.getCompanyId()));
            vo.setFailSmsCount(companySmsMapper.failSmsCount(vo.getCompanyId()));
            vo.setSendSmsCount(companySmsMapper.sendSmsCount(vo.getCompanyId()));
            vo.setDebitSmsCount(companySmsMapper.debitSmsCount(vo.getCompanyId()));
        }
        return list;
    }

    /**
     * 新增公司短信
     *
     * @param companySms 公司短信
     * @return 结果
     */
    @Override
    public int insertCompanySms(CompanySms companySms)
    {
        return companySmsMapper.insertCompanySms(companySms);
    }

    /**
     * 修改公司短信
     *
     * @param companySms 公司短信
     * @return 结果
     */
    @Override
    public int updateCompanySms(CompanySms companySms)
    {
        return companySmsMapper.updateCompanySms(companySms);
    }

    /**
     * 批量删除公司短信
     *
     * @param smsIds 需要删除的公司短信ID
     * @return 结果
     */
    @Override
    public int deleteCompanySmsByIds(Long[] smsIds)
    {
        return companySmsMapper.deleteCompanySmsByIds(smsIds);
    }

    /**
     * 删除公司短信信息
     *
     * @param smsId 公司短信ID
     * @return 结果
     */
    @Override
    public int deleteCompanySmsById(Long smsId)
    {
        return companySmsMapper.deleteCompanySmsById(smsId);
    }

    @Override
    public CompanySms selectCompanySmsByCompanyId(Long companyId) {
        return companySmsMapper.selectCompanySmsByCompanyId(companyId);
    }

    @Override
    public int subCompanySms(Long companyId, int number) {
        return companySmsMapper.subCompanySms(companyId,number);
    }

    @Override
    public int addCompanySms(Long companyId, int number) {
        return companySmsMapper.addCompanySms(companyId,number);
    }

    @Override
    public CompanySms selectCompanySmsByCompanyIdForUpdate(Long companyId) {
        return companySmsMapper.selectCompanySmsByCompanyIdForUpdate(companyId);
    }

    /**
     * 公司充值短信套餐
     *
     * @param compBuySmsDTO 请求参数
     * @return CompanySmsOrder 订单数据
     */
    @Override
    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
    public CompanySmsOrder buySms(CompBuySmsDTO compBuySmsDTO) {
        String companyId = compBuySmsDTO.getCompanyId();
        String packageId = compBuySmsDTO.getPackageId();
        log.info("开始购买短信服务，公司ID：{}，套餐ID：{}", companyId, packageId);

        Company company = companyMapper.selectCompanyByIdForUpdate(Long.valueOf(companyId));
        Asserts.notNull(company,"该公司没有不存在!");
        log.info("查询公司信息，公司ID：{}，公司信息：{}", companyId, company);

        CompanySmsPackage companySmsPackage = companySmsPackageMapper.selectCompanySmsPackageById(Long.valueOf(packageId));
        Asserts.notNull(companySmsPackage, "该套餐不存在!");
        log.info("查询短信套餐信息，套餐ID：{}，套餐信息：{}", packageId, companySmsPackage);

        if(ObjectUtil.notEqual(companySmsPackage.getStatus(),1L)){
            log.error("购买短信套餐失败，套餐已禁用，套餐ID：{}", packageId);
            throw new CustomException("该套餐已经禁用!");
        }
        if(ObjectUtil.isNull(company.getMoney())){
            company.setMoney(BigDecimal.ZERO);
        }

        if(ObjectUtil.isNull(companySmsPackage.getPrice())){
            companySmsPackage.setPrice(BigDecimal.ZERO);
        }

        // 检查公司余额是否足够
        if(ObjectUtil.equal(company.getMoney().compareTo(companySmsPackage.getPrice()),-1)) {
            log.error("购买短信套餐失败，公司余额不足，公司ID：{}，当前余额：{}，套餐价格：{}", companyId, company.getMoney(), companySmsPackage.getPrice());
            throw new CustomException("当前公司余额不足以完成支付本次购买!");
        }


        // 创建订单
        CompanySmsOrder order = new CompanySmsOrder();
        order.setCompanyId(Long.valueOf(companyId));
        order.setPackageId(Long.valueOf(packageId));
        order.setSmsCount(companySmsPackage.getSmsCount());
        order.setPrice(companySmsPackage.getPrice());
        order.setPayMoney(companySmsPackage.getPrice());
        order.setOrderCode(IdUtil.getSnowflake(0, 0).nextIdStr());
        order.setStatus(1);
        order.setPayTime(new Date());
        companySmsOrderMapper.insertCompanySmsOrder(order);


        // 套餐数量变化
        CompanySms companySms = companySmsMapper.selectCompanySmsByCompanyIdForUpdate(Long.valueOf(companyId));
        if(ObjectUtil.isNull(companySms)){
            companySms = new CompanySms();
            companySms.setCompanyId(Long.valueOf(companyId));
            companySms.setRemainSmsCount(companySmsPackage.getSmsCount());
            companySms.setTotalSmsCount(companySmsPackage.getSmsCount());
            companySmsMapper.insertCompanySms(companySms);
            log.info("首次购买短信，插入公司短信余量记录，公司ID：{}", companyId);
        } else {
            companySms.setRemainSmsCount(companySms.getRemainSmsCount() + companySmsPackage.getSmsCount());
            companySms.setTotalSmsCount(companySms.getTotalSmsCount() + companySmsPackage.getSmsCount());
            companySmsMapper.updateCompanySms(companySms);
            log.info("更新公司短信余量记录，公司ID：{}，更新后短信余量：{}", companyId, companySms.getRemainSmsCount());
        }

        // 公司余额扣减
        company.setMoney(company.getMoney().subtract(companySmsPackage.getPrice()));
        companyMapper.updateCompany(company);
        log.info("更新公司余额，公司ID：{}，更新后余额：{}", companyId, company.getMoney());


        // 新增公司账户记录
        CompanyMoneyLogs companyMoneyLogs = new CompanyMoneyLogs();
        companyMoneyLogs.setCompanyId(Long.valueOf(companyId));
        companyMoneyLogs.setMoney(companySmsPackage.getPrice());
        companyMoneyLogs.setBalance(company.getMoney());

        companyMoneyLogs.setRemark("短信充值");

        companyMoneyLogs.setBusinessId(String.valueOf(order.getOrderId()));
        companyMoneyLogs.setLogsType(11);

        companyMoneyLogsMapper.insertCompanyMoneyLogs(companyMoneyLogs);
        log.info("插入公司账户记录，公司ID：{}，业务ID（订单ID）：{}", companyId, order.getOrderId());
        log.info("购买短信服务成功，订单号：{}", order.getOrderCode());

        return order;
    }
}
