package cn.cslg.pas.service;

import cn.cslg.pas.domain.PatentLicensor;
import cn.cslg.pas.common.model.params.PatentLicensorParams;
import cn.cslg.pas.mapper.PatentLicensorMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 专利信息许可人表 服务类
 * </p>
 *
 * @author 王岩
 * @since 2022-02-24
 */
@Service
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class PatentLicensorService extends ServiceImpl<PatentLicensorMapper, PatentLicensor> {

    public List<PatentLicensor> getPatentLicensorByPatentIds(List<Integer> patentIds) {
        if (patentIds == null || patentIds.size() == 0) {
            return new ArrayList<>();
        }
        LambdaQueryWrapper<PatentLicensor> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(PatentLicensor::getPatentId, patentIds);
        return this.list(queryWrapper);
    }

    public void importPatentLicensor(Integer localPatentId, Integer importPatentId, List<PatentLicensor> importPatentLicensorList) {
        this.deletePatentLicensorByPatentId(localPatentId);
        List<PatentLicensor> patentLicensorList = importPatentLicensorList.stream().filter(item -> item.getPatentId().equals(importPatentId)).collect(Collectors.toList());
        for (PatentLicensor patentLicensor : patentLicensorList) {
            patentLicensor.setId(null);
            patentLicensor.setPatentId(localPatentId);
        }
        this.saveOrUpdateBatch(patentLicensorList);
    }

    /**
     * 插入或更新专利信息许可人表“os_patent_licensor”数据
     *
     * @param patentLicensorParams 许可人相关信息
     */
    public void updatePatentLicensor(PatentLicensorParams patentLicensorParams) {
        if (patentLicensorParams.getLicensor() == null || patentLicensorParams.getLicensee() == null || patentLicensorParams.getType() == null) {
            return;
        }

        //判断若许可人、被许可人、许可类型三者数量相同则开始进行保存操作
        if (patentLicensorParams.getLicensor().size() == patentLicensorParams.getLicensee().size() && patentLicensorParams.getLicensee().size() == patentLicensorParams.getType().size() && patentLicensorParams.getType().size() != 0) {
            //根据专利id删除专利信息许可人表“os_patent_licensor”原数据
            this.deletePatentLicensorByPatentId(patentLicensorParams.getPatentId());
            //创建专利信息许可人表实体类集合，准备批量插入数据
            List<PatentLicensor> patentLicensorList = new ArrayList<>();
            //遍历集合，创建实体类装载数据
            for (int i = 0; i < patentLicensorParams.getLicensor().size(); i++) {
                PatentLicensor patentLicensor = new PatentLicensor();
                patentLicensor.setType(patentLicensorParams.getType().get(i));
                patentLicensor.setLicensor(patentLicensorParams.getLicensor().get(i));
                patentLicensor.setLicensee(patentLicensorParams.getLicensee().get(i));
                patentLicensor.setPatentId(patentLicensorParams.getPatentId());
                patentLicensorList.add(patentLicensor);
            }
            //批量插入或更新数据
            this.saveOrUpdateBatch(patentLicensorList);
        }
    }

    /**
     * 根据专利id删除专利信息许可人表“os_patent_licensor”数据
     *
     * @param patentId 专利id
     */
    public void deletePatentLicensorByPatentId(Integer patentId) {
        this.remove(Wrappers.<PatentLicensor>lambdaQuery().eq(PatentLicensor::getPatentId, patentId));
    }
}
