package com.jiayue.ipfcst.console.service;

import com.jiayue.ipfcst.common.core.exception.BusinessException;
import com.jiayue.ipfcst.common.data.entity.InverterInfo;
import com.jiayue.ipfcst.common.data.entity.SysParameter;
import com.jiayue.ipfcst.common.data.repository.InverterInfoRepository;
import com.jiayue.ipfcst.common.data.service.BaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 逆变器业务层
 *
 * @author zzy
 * @version 1.0
 * @since 2019/8/7 10:58
 */
@Service
@Slf4j
public class InverterInfoService extends BaseService {
    private final InverterInfoRepository inverterInfoRepository;

    @Autowired
    public InverterInfoService(InverterInfoRepository inverterInfoRepository) {
        this.inverterInfoRepository = inverterInfoRepository;
    }


    /**
     * 新增逆变器
     *
     * @param inverterInfo 逆变器
     * @throws BusinessException 业务异常
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public void add(InverterInfo inverterInfo) throws BusinessException {
        this.inverterInfoRepository.save(inverterInfo);
    }


    /**
     * 批量新增逆变器
     *
     * @param inverterInfo 逆变器
     * @throws BusinessException 业务异常
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public void addALL(InverterInfo inverterInfo, Integer startValue, Integer endValue) throws BusinessException {
        for (int i = startValue; i < startValue + endValue; i++) {
            InverterInfo inverterInfo1 = new InverterInfo();
            inverterInfo1.setManufacturer(inverterInfo.getManufacturer());
            inverterInfo1.setReport(inverterInfo.getReport());
            inverterInfo1.setInstallationTime(inverterInfo.getInstallationTime());
            inverterInfo1.setName(inverterInfo.getName() + "-" + i);
            inverterInfo1.setBatteryModel(inverterInfo.getBatteryModel());
            inverterInfo1.setBatteryNumber(inverterInfo.getBatteryNumber());
            inverterInfo1.setBox(inverterInfo.getBox());
            inverterInfo1.setCapacity(inverterInfo.getCapacity());
            inverterInfo1.setCollectorCircuit(inverterInfo.getCollectorCircuit());
            inverterInfo1.setEfficiency(inverterInfo.getEfficiency());
            inverterInfo1.setGroupSeries(inverterInfo.getGroupSeries());
            inverterInfo1.setSample(inverterInfo.getSample());
            inverterInfo1.setModelNumber(inverterInfo.getModelNumber());
            inverterInfo1.setInterval(inverterInfo.getInterval());
            inverterInfo1.setBackupA(inverterInfo.getBackupA());
            inverterInfo1.setBackupB(inverterInfo.getBackupB());
            inverterInfo1.setBackupC(inverterInfo.getBackupC());
            this.inverterInfoRepository.save(inverterInfo1);
        }


//        boolean b = this.inverterRepository.existsById(inverter.getNo());
//        if (b) {// 逆变器编号已存在
//            throw new BusinessException("逆变器编号已存在!");
//        } else {
//
//        }
    }

    /**
     * 修改逆变器
     *
     * @param inverterInfo 逆变器
     * @throws BusinessException 业务异常
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public void update(InverterInfo inverterInfo) throws BusinessException {
        if (StringUtils.isEmpty(inverterInfo.getId())) {
            throw new BusinessException("逆变器编号不能为空!");
        } else {
            this.inverterInfoRepository.save(inverterInfo);
        }
    }

    /**
     * 删除逆变器
     *
     * @param id 逆变器编号
     * @throws BusinessException 业务异常
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public void delete(final Integer id) throws BusinessException {
        if (StringUtils.isEmpty(id)) {
            throw new BusinessException("逆变器编号不能为空!");
        } else {
            this.inverterInfoRepository.deleteById(id);
        }
    }

    /**
     * 查询逆变器
     *
     * @param id 逆变器编号
     * @return 逆变器
     * @throws BusinessException 业务异常
     */
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public InverterInfo get(final Integer id) throws BusinessException {
        Optional<InverterInfo> optional = this.inverterInfoRepository.findById(id);
        if (optional.isPresent()) {
            return optional.get();
        } else {
            throw new BusinessException("逆变器不存在!");
        }
    }

    /*
     *//**
     * 查询逆变器【分页查询】
     *
     * @param inverter 查询条件
     * @param page     页码
     * @param size     每页记录数
     * @return 分页结果
     *//*
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public Page<Inverter> get(final Inverter inverter, final Integer page, final Integer size) {
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("modelNumber", ExampleMatcher.GenericPropertyMatchers.contains())
                .withMatcher("box", ExampleMatcher.GenericPropertyMatchers.contains())
                .withMatcher("collectorCircuit", ExampleMatcher.GenericPropertyMatchers.contains());
        Example<Inverter> example = Example.of(inverter, matcher);
        Pageable pageable = PageRequest.of(page - 1, size);
        return this.inverterRepository.findAll(example, pageable);
    }*/


    /**
     * 查询逆变器【分页查询】
     *
     * @param page 页码
     * @param size 每页记录数
     * @return 分页结果
     */
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public Page<InverterInfo> get(final Boolean sample, final Integer page, final Integer size) {
        Specification<InverterInfo> specification = this.getDemoQuerySpecification(sample);
        Sort sort = Sort.by(Sort.Direction.ASC, "id");
        Pageable pageable = PageRequest.of(page - 1, size, sort); //页码：前端从1开始，jpa从0开始，做个转换
        Page pagepvModuleModel = this.inverterInfoRepository.findAll(specification, pageable);
        pagepvModuleModel.getContent();
        /*map.put("content", pagepvModuleModel.getContent());// 结果集
        map.put("count", pagepvModuleModel.getTotalElements());// 总记录数*/
        return pagepvModuleModel;
    }

    /**
     * 查询逆变器【分页查询】
     *
     * @param page 页码
     * @param size 每页记录数
     * @return 分页结果
     */
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public List<InverterInfo> getAll() {
        return inverterInfoRepository.findAll();
    }


    /**
     * 查询所有样板机逆变器 create by xiuwei
     *
     * @return 逆变器信息
     */
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public List<InverterInfo> getAllSample() {
        InverterInfo inverterInfo = new InverterInfo();
        inverterInfo.setSample(true);
        return inverterInfoRepository.findAll(Example.of(inverterInfo));
    }


    /**
     * 查询条件
     *
     * @param sample 是否样板机
     * @return 查询条件
     */
    private Specification<InverterInfo> getDemoQuerySpecification(Boolean sample) {
        return (Specification<InverterInfo>) (root, criteriaQuery, cb) -> {
            List<Predicate> predicates = new ArrayList<>();
            if (null != sample) {
                predicates.add(cb.equal(root.get("sample").as(Boolean.class), sample));
            }

            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
        };
    }


    /**
     * 保存光伏组件信息
     *
     * @param inverterInfo 光伏组件信息
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public void save(InverterInfo inverterInfo) {
        this.inverterInfoRepository.save(inverterInfo);
    }

    /**
     * 删除逆变器信息
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public boolean delete(String ids) {
        boolean flag = false;
        if (!StringUtils.isEmpty(ids)) {
            String[] idArray = ids.split(",");
            if (idArray != null && idArray.length > 0) {
                for (String id : idArray) {
                    this.inverterInfoRepository.deleteById(Integer.valueOf(id));
                    log.info("删除逆变器ID为[" + id + "]成功！");

                }
                flag = true;
            } else {
                this.inverterInfoRepository.deleteById(Integer.valueOf(ids));
                flag = true;
                log.info("删除逆变器ID为[" + ids + "]成功！");
            }
        }

        return flag;

    }

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void saveCloud(InverterInfo bean) {
//        InverterInfo inverterInfo = inverterInfoRepository.findByName(bean.getName());
//        if (null != inverterInfo) {
//            bean.setId(inverterInfo.getId());
//        }
        inverterInfoRepository.save(bean);
    }


    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void saveCloud(List<InverterInfo> beans) {
        if(beans != null && beans.size() > 0){
            inverterInfoRepository.deleteAll();
            inverterInfoRepository.saveAll(beans);
        }
    }
}
