package com.izouma.zhirongip.service.supply;

import cn.hutool.core.collection.CollUtil;
import com.izouma.zhirongip.domain.Information;
import com.izouma.zhirongip.domain.Setting;
import com.izouma.zhirongip.domain.supply.Patent;
import com.izouma.zhirongip.dto.PageQuery;
import com.izouma.zhirongip.enums.ApplyStatus;
import com.izouma.zhirongip.exception.BusinessException;
import com.izouma.zhirongip.repo.InformationRepo;
import com.izouma.zhirongip.repo.SettingRepo;
import com.izouma.zhirongip.repo.supply.PatentRepo;
import com.izouma.zhirongip.utils.JpaUtils;
import lombok.AllArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.stream.Collectors;

@Service
@AllArgsConstructor
public class PatentService {

    private final PatentRepo      patentRepo;
    private final SettingRepo     settingRepo;
    private final InformationRepo informationRepo;

    public Page<Patent> all(PageQuery pageQuery) {
        Map<Long, String> settingMap = settingRepo.findAllByFlagIn(CollUtil.list(false, 1, 13, 24, 25, 26)).stream()
                .collect(Collectors.toMap(Setting::getId, Setting::getName));
        return patentRepo.findAll(JpaUtils.toSpecification(pageQuery, Patent.class), JpaUtils.toPageRequest(pageQuery))
                .map(cd -> {
                    cd.setIndustryName(settingMap.get(cd.getIndustryClass()));
                    if (cd.getPatentTypeId() != null) {
                        cd.setPatentType(settingMap.get(cd.getPatentTypeId()));
                    }
                    if (cd.getLawStatusId() != null) {
                        cd.setLawStatus(settingMap.get(cd.getLawStatusId()));
                    }
                    if (cd.getTradingMethodId() != null) {
                        cd.setTradingMethod(settingMap.get(cd.getTradingMethodId()));
                    }
                    return cd;
                });
    }

    public Patent get(Long id) {
        Patent patent = patentRepo.findById(id).orElseThrow(new BusinessException("无记录"));
        patent.setIndustryName(settingRepo.findById(patent.getIndustryClass())
                .orElseThrow(new BusinessException("无记录"))
                .getName());

        if (patent.getPatentTypeId() != null) {
            patent.setPatentType(settingRepo.findById(patent.getPatentTypeId())
                    .orElseThrow(new BusinessException("无记录"))
                    .getName());
        }
        if (patent.getLawStatusId() != null) {
            patent.setLawStatus(settingRepo.findById(patent.getLawStatusId())
                    .orElseThrow(new BusinessException("无记录"))
                    .getName());
        }
        if (patent.getTradingMethodId() != null) {
            patent.setTradingMethod(settingRepo.findById(patent.getTradingMethodId())
                    .orElseThrow(new BusinessException("无记录"))
                    .getName());
        }
        return patent;
    }

    public void audit(Long id, boolean pass, String remark) {
        Patent record = patentRepo.findById(id).orElseThrow(new BusinessException("无记录"));

        Information information = Information.builder()
                .receiveUserId(record.getUserId())
                .isRead(false)
                .build();

        if (pass) {
            record.setStatus(ApplyStatus.PASS);
            patentRepo.save(record);

            information.setContent("您发布的供给侧：" + record.getName() + "已通过审核！");
            informationRepo.save(information);
            return;
        }
        record.setStatus(ApplyStatus.DENY);
        patentRepo.save(record);

        information.setContent("您发布的的供给侧：" + record.getName() + "未通过审核，原因为：" + remark);
        informationRepo.save(information);
    }
}
