package com.zd.exam.service.impl;

import cn.hutool.core.util.StrUtil;
import com.zd.common.core.exception.ServiceException;
import com.zd.common.core.utils.DateUtils;
import com.zd.common.core.utils.SecurityUtils;
import com.zd.common.security.utils.SaveUtil;
import com.zd.exam.domain.ElPassConfigdetail;
import com.zd.exam.domain.ElPassMarkconfig;
import com.zd.exam.domain.vo.ElPassMarkconfigVO;
import com.zd.exam.mapper.ElPassConfigdetailMapper;
import com.zd.exam.mapper.ElPassMarkconfigMapper;
import com.zd.exam.service.IElPassMarkconfigService;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * 信用合格分设置Service业务层处理
 *
 * @author zd
 * @date 2021-12-14
 */
@Service
public class ElPassMarkconfigServiceImpl implements IElPassMarkconfigService
{
    @Autowired
    private ElPassMarkconfigMapper elPassMarkconfigMapper;

    @Autowired
    private ElPassConfigdetailMapper elPassConfigdetailMapper;

    /**
     * 查询信用合格分设置
     *
     * @param id 信用合格分设置主键
     * @return 信用合格分设置
     */
    @Override
    public ElPassMarkconfig selectElPassMarkconfigById(Long id)
    {
        return elPassMarkconfigMapper.selectElPassMarkconfigById(id);
    }

    /**
     * 查询信用合格分设置列表
     *
     * @param elPassMarkconfig 信用合格分设置
     * @return 信用合格分设置
     */
    @Override
    public List<ElPassMarkconfigVO> selectElPassMarkconfigList(ElPassMarkconfig elPassMarkconfig)
    {
        List<ElPassMarkconfigVO> markconfigs = elPassMarkconfigMapper.selectElPassMarkconfigList(elPassMarkconfig);
        Optional.ofNullable(markconfigs).orElseGet(Collections::emptyList).stream().forEach(a->{
            ElPassConfigdetail configdetail = new ElPassConfigdetail();
            configdetail.setMarkconfigId(a.getId());
            a.setConfigDetailList(elPassConfigdetailMapper.selectElPassConfigdetailList(configdetail));
        });
        return markconfigs;
    }

    /**
     * 新增信用合格分设置
     *
     * @param elPassMarkconfig 信用合格分设置
     * @return 结果
     */
    @Override
    public int insertElPassMarkconfig(ElPassMarkconfig elPassMarkconfig)
    {
        //设置其他公共字段
        SaveUtil.setCommonAttr(elPassMarkconfig);
        return elPassMarkconfigMapper.insertElPassMarkconfig(elPassMarkconfig);
    }


    /**
     * 新增信用合格分和详情
     *
     * @param elPassMarkconfigVO 新增信用合格分和详情
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addPassMark(ElPassMarkconfigVO elPassMarkconfigVO)
    {

        ElPassMarkconfig elPassMarkconfig = new ElPassMarkconfig();
        BeanUtils.copyProperties(elPassMarkconfigVO,elPassMarkconfig);
        //设置其他公共字段
        SaveUtil.setCommonAttr(elPassMarkconfig);
        int flag = elPassMarkconfigMapper.insertElPassMarkconfig(elPassMarkconfig);
        if(elPassMarkconfigVO.getConfigDetailList().size()==0){
            throw new ServiceException("请设置信用分值段！！");
        }
        //添加详情信息
        elPassMarkconfigVO.getConfigDetailList().stream().forEach(a->{
            a.setMarkconfigId(elPassMarkconfig.getId());
            addPassMarkDetail(a);
        });
        return flag;
    }

    /**
     * 新增信用详情记录
     *
     * @param elPassConfigdetail 新增信用详情记录
     * @return 结果
     */
    public void addPassMarkDetail(ElPassConfigdetail elPassConfigdetail){
        SaveUtil.setCommonAttr(elPassConfigdetail);
        elPassConfigdetailMapper.insertElPassConfigdetail(elPassConfigdetail);
    }


    /**
     * 修改信用合格分设置
     *
     * @param elPassMarkconfig 信用合格分设置
     * @return 结果
     */
    @Override
    public int updateElPassMarkconfig(ElPassMarkconfig elPassMarkconfig)
    {
        elPassMarkconfig.setUpdateTime(DateUtils.getNowDate());
        elPassMarkconfig.setUpdateBy(SecurityUtils.getUsername());
        return elPassMarkconfigMapper.updateElPassMarkconfig(elPassMarkconfig);
    }

    /**
     * 修改信用合格分和详情
     *
     * @param elPassMarkconfigVO 修改信用合格分和详情
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int editPassMark(ElPassMarkconfigVO elPassMarkconfigVO)
    {
        if(elPassMarkconfigVO.getId()==null ){
            throw new ServiceException("修改失败，请联系管理员！！！");
        }
        //先删除旧的信用分
        ElPassConfigdetail configdetail = new ElPassConfigdetail();
        configdetail.setMarkconfigId(elPassMarkconfigVO.getId());
        List<ElPassConfigdetail> configDetailList = elPassConfigdetailMapper.selectElPassConfigdetailList(configdetail);
        Long[] configDetailIds = new Long[configDetailList.size()];
        for(int i=0;i<configDetailList.size();i++){
            configDetailIds[i] = configDetailList.get(i).getId();
        }
        //删除详情列表的关联数据
        elPassConfigdetailMapper.deleteElPassConfigdetailByIds(configDetailIds);
        //删除信用合格数据
        elPassMarkconfigMapper.deleteElPassMarkconfigById(elPassMarkconfigVO.getId());

        //重新添加信用分和详情
        int flag = addPassMark(elPassMarkconfigVO);
        return flag;
    }

    /**
     * 批量删除信用合格分设置
     *
     * @param ids 需要删除的信用合格分设置主键
     * @return 结果
     */
    @Override
    public int deleteElPassMarkconfigByIds(Long[] ids)
    {
        return elPassMarkconfigMapper.deleteElPassMarkconfigByIds(ids);
    }

    /**
     * 删除信用合格分设置信息
     *
     * @param id 信用合格分设置主键
     * @return 结果
     */
    @Override
    public int deleteElPassMarkconfigById(Long id)
    {
        return elPassMarkconfigMapper.deleteElPassMarkconfigById(id);
    }
}
