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.Logo;
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.LogoRepo;
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 LogoService {

    private final LogoRepo        logoRepo;
    private final SettingRepo     settingRepo;
    private final InformationRepo informationRepo;

    public Page<Logo> all(PageQuery pageQuery) {
        Map<Long, String> settingMap = settingRepo.findAllByFlagIn(CollUtil.list(false, 2,24)).stream()
                .collect(Collectors.toMap(Setting::getId, Setting::getName));
        return logoRepo.findAll(JpaUtils.toSpecification(pageQuery, Logo.class), JpaUtils.toPageRequest(pageQuery))
                .map(cd -> {
                    cd.setCategoryName(settingMap.get(cd.getCategory()));
                    if(cd.getTradingMethodId()!=null){
                        cd.setTradingMethod(settingMap.get(cd.getTradingMethodId()));
                    }
                    return cd;
                });
    }

    public Logo get(Long id) {
        Logo logo = logoRepo.findById(id).orElseThrow(new BusinessException("无记录"));
        logo.setCategoryName(settingRepo.findById(logo.getCategory())
                .orElseThrow(new BusinessException("无记录"))
                .getName());

        if(logo.getTradingMethodId()!=null){
            logo.setTradingMethod(settingRepo.findById(logo.getTradingMethodId())
                    .orElseThrow(new BusinessException("无记录"))
                    .getName());
        }
        return logo;
    }

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

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

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

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

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