package com.chinaweal.aiccs.aiccs.susnate.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chinaweal.aiccs.aiccs.abnormal.entity.EBaseinfo;
import com.chinaweal.aiccs.aiccs.abnormal.service.EBaseinfoService;
import com.chinaweal.aiccs.aiccs.dict.service.CmsDictCodeService;
import com.chinaweal.aiccs.aiccs.susnate.dto.EntBaseWithFalPerInfoQueryDTO;
import com.chinaweal.aiccs.aiccs.susnate.dto.FalPerInfoAddDTO;
import com.chinaweal.aiccs.aiccs.susnate.dto.FalPerInfoQueryDTO;
import com.chinaweal.aiccs.aiccs.susnate.dto.FalPerInfoUpdateDTO;
import com.chinaweal.aiccs.aiccs.susnate.entity.EFalPerInfo;
import com.chinaweal.aiccs.aiccs.susnate.mapper.EFalPerInfoMapper;
import com.chinaweal.aiccs.aiccs.susnate.service.IEFalPerInfoService;
import com.chinaweal.aiccs.aiccs.susnate.vo.EntBaseWithFalPerInfoVO;
import com.chinaweal.aiccs.aiccs.system.service.TRBaseCodeService;
import com.chinaweal.aiccs.common.constant.CommonConstants;
import com.chinaweal.aiccs.common.util.StringUtils;
import com.chinaweal.aiccs.org.entity.OrgUnits;
import com.chinaweal.aiccs.org.service.AicorgService;
import com.chinaweal.aicorg.model.AICUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

/**
 *
 * @author zhouxy
 * @since 2025-12-29
 */
@Service
public class EFalPerInfoServiceImpl extends ServiceImpl<EFalPerInfoMapper, EFalPerInfo> implements IEFalPerInfoService {

    @Autowired
    private EBaseinfoService eBaseinfoService;

    @Autowired
    private TRBaseCodeService trBaseCodeService;

    @Autowired
    private CmsDictCodeService cmsDictCodeService;

    @Autowired
    private AicorgService aicorgService;

    @Override
    public EFalPerInfo addFalPerInfo(FalPerInfoAddDTO dto, AICUser curUser) {
        EFalPerInfo entity = new EFalPerInfo();
        entity.setEntname(dto.getEntname());
        entity.setUniscid(dto.getUniscid());
        entity.setRegno(dto.getRegno());
        entity.setName(dto.getName());
        entity.setCerType(dto.getCerType());
        entity.setCerNo(dto.getCerNo());
        entity.setHandlRest(dto.getHandlRest());
        entity.setHandlRea(dto.getHandlRea());
        entity.setJudAuth(dto.getJudAuth());
        entity.setJudDate(dto.getJudDate());
        entity.setDstate(CommonConstants.FALSE_0);
        entity.setSExtDataTime(LocalDateTime.now());
        // BUG修复：s_ext_fromnode 统一设置为 150000
        entity.setSExtFromNode("150000");

        // BUG修复：通过 uniscid 或 regno 获取 pripid
        if (StringUtils.isBlank(entity.getPripid()) && StringUtils.isNotBlank(dto.getUniscid())) {
            EBaseinfo baseinfo = eBaseinfoService.getEntBaseInfoByCode(dto.getUniscid());
            if (baseinfo != null) {
                entity.setPripid(baseinfo.getPripid());
            }
        }
        // BUG修复：通过 judAuth 获取 judAuthCn
        if (StringUtils.isNotBlank(dto.getJudAuth())) {
            String code = StringUtils.fillZeroSuffix(StringUtils.clearRegionZero(dto.getJudAuth()), 6);
            OrgUnits one = aicorgService.lambdaQuery().eq(OrgUnits::getOrgNumber, code).eq(OrgUnits::getUnitType, "1")
                    .eq(OrgUnits::getDeleted, CommonConstants.FALSE_0).last("limit 1").one();
            if (one != null) {
                entity.setJudAuthCn(one.getOrgUnitName());
            }
        }

        save(entity);
        return entity;
    }

    @Override
    public EFalPerInfo updateFalPerInfo(FalPerInfoUpdateDTO dto) {
        EFalPerInfo entity = new EFalPerInfo();
        entity.setFalperId(dto.getFalperId());
        entity.setEntname(dto.getEntname());
        entity.setUniscid(dto.getUniscid());
        entity.setRegno(dto.getRegno());
        entity.setName(dto.getName());
        entity.setCerType(dto.getCerType());
        entity.setCerNo(dto.getCerNo());
        entity.setHandlRest(dto.getHandlRest());
        entity.setHandlRea(dto.getHandlRea());
        entity.setJudAuth(dto.getJudAuth());
        entity.setJudDate(dto.getJudDate());
        entity.setSExtDataTime(LocalDateTime.now());

        // BUG修复：通过 uniscid 或 regno 获取 pripid
        if (StringUtils.isBlank(entity.getPripid()) && StringUtils.isNotBlank(dto.getUniscid())) {
            EBaseinfo baseinfo = eBaseinfoService.getEntBaseInfoByCode(dto.getUniscid());
            if (baseinfo != null) {
                entity.setPripid(baseinfo.getPripid());
            }
        }

        // BUG修复：通过 judAuth 获取 judAuthCn
        if (StringUtils.isNotBlank(dto.getJudAuth())) {
            String code = StringUtils.fillZeroSuffix(StringUtils.clearRegionZero(dto.getJudAuth()), 6);
            OrgUnits one = aicorgService.lambdaQuery().eq(OrgUnits::getOrgNumber, code).eq(OrgUnits::getUnitType, "1")
                    .eq(OrgUnits::getDeleted, CommonConstants.FALSE_0).last("limit 1").one();
            if (one != null) {
                entity.setJudAuthCn(one.getOrgUnitName());
            }
        }

        updateById(entity);
        return entity;
    }

    @Override
    public boolean deleteFalPerInfo(String falperId) {
        EFalPerInfo entity = new EFalPerInfo();
        entity.setFalperId(falperId);
        entity.setDstate("2");
        return updateById(entity);
    }

    @Override
    public IPage<EntBaseWithFalPerInfoVO> listEntBaseWithFalPerInfo(Page<EntBaseWithFalPerInfoVO> page, EntBaseWithFalPerInfoQueryDTO query) {
        return baseMapper.selectEntBaseWithFalPerInfo(page, query);
    }

    @Override
    public IPage<EFalPerInfo> listFalPerInfo(Page<EFalPerInfo> page, FalPerInfoQueryDTO query) {
        LambdaQueryWrapper<EFalPerInfo> lambdaQueryWrapper = Wrappers.lambdaQuery();

        if (query != null) {
            lambdaQueryWrapper.eq(StringUtils.isNotBlank(query.getUniscid()), EFalPerInfo::getUniscid, query.getUniscid());
            lambdaQueryWrapper.like(StringUtils.isNotBlank(query.getEntname()), EFalPerInfo::getEntname, query.getEntname());
        }
        lambdaQueryWrapper.ne(EFalPerInfo::getDstate, "2");

        return page(page, lambdaQueryWrapper);
    }
}
