package com.securitycontrol.background.service.impl;

import com.securitycontrol.background.mapper.TbAreaMapper;
import com.securitycontrol.background.service.SourceFileService;
import com.securitycontrol.background.service.TbAreaService;
import com.securitycontrol.common.core.constant.SecurityConstants;
import com.securitycontrol.common.core.domain.Result;
import com.securitycontrol.common.core.utils.aes.DateTimeHelper;
import com.securitycontrol.common.core.utils.aes.ListHelper;
import com.securitycontrol.common.core.utils.aes.StringHelper;
import com.securitycontrol.common.core.utils.uuid.IdUtils;
import com.securitycontrol.entity.background.dto.AreaDto;
import com.securitycontrol.entity.background.vo.AreaVo;
import com.securitycontrol.entity.background.vo.GtVo;
import com.securitycontrol.entity.file.FileExportVo;
import com.securitycontrol.entity.screen.vo.ProCostVo;
import com.securitycontrol.entity.system.SystemGlobal;
import com.securitycontrol.system.api.RemoteFileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 区域管理接口处理层
 * @author 黑子
 */
@Service
@Slf4j
public class TbAreaServiceImpl  implements TbAreaService {

    @Resource
    private RemoteFileService remoteFileService;
    @Resource
    private SourceFileService sourceFileService;
    @Autowired
    private TbAreaMapper mapper;

    @Override
    public List<AreaVo> getAreaList(AreaDto dto) {
        return  mapper.getAreaList(dto);
    }

    /**
     * 新增区域管理
     * @param dto
     * @return
     */
    @Override
    public Result<String> addArea(AreaVo dto) {
           try{
                 String result=checkData(dto);
               if (StringHelper.isNotEmpty(result)) {
                   return Result.fail(result);
               }
               dto.setAreaId(IdUtils.getUUId());
               int num=mapper.insertData(dto);
               if (num==SystemGlobal.SUCCESS_NUM){
                   return Result.ok("新增成功","新增成功");
               }
               return Result.fail("新增失败,请联系管理员!");
           }catch (Exception e){
               log.error(e.toString(),e);
               return Result.fail("系统升级中,请稍后重试!");
           }
    }

    /**
     * 修改区域信息
     * @param dto
     * @return
     */
    @Override
    public Result<String> updateArea(AreaVo dto) {
        try{
            String result=checkData(dto);
            if (StringHelper.isNotEmpty(result)) {
                return Result.fail(result);
            }
            int num=mapper.updateData(dto);
            if (num==SystemGlobal.SUCCESS_NUM){
                return Result.ok("修改成功","修改成功");
            }
            return Result.fail("修改失败,请联系管理员!");
        }catch (Exception e){
            log.error(e.toString(),e);
            return Result.fail("系统升级中,请稍后重试!");
        }
    }

    /**
     * 删除区域
     * @param dto
     * @return
     */
    @Override
    public Result<String> deleteArea(AreaDto dto) {
            try{
                if(StringHelper.isEmpty(dto.getAreaId())){
                    return Result.fail("修改失败,条件不能为空!");
                }
                String ids=dto.getAreaId();
                List<String> list= Arrays.asList(ids.split("@"));
                AtomicBoolean isDel= new AtomicBoolean(true);
                list.forEach(id->{
                    int num=mapper.deleteArea(id);
                    if (num!=SystemGlobal.SUCCESS_NUM){
                        isDel.set(false);
                    }

                });
                if(isDel.get()){
                    return Result.ok("删除成功","删除成功");
                }
                  return Result.fail("删除失败,数据不存在!");
            }catch (Exception e){
                log.error(e.toString(),e);
                return Result.fail("系统升级中,请稍后重试!");
            }
    }

    /**
     * 杆塔信息查询
     * @param dto
     * @return
     */
    @Override
    public List<GtVo> getGtList(AreaDto dto) {
        return  mapper.getGtList(dto);
    }

    /**
     *
     * @param dto
     * @return
     */
    @Override
    public Result<String> addGtData(GtVo dto) {
            try{
                String result=checkData2(dto);
                if(StringHelper.isNotEmpty(result)){
                    return Result.fail(result);
                }
                dto.setGtId(IdUtils.getUUId());
              int num= mapper.addGtData(dto);
                if(SystemGlobal.SUCCESS_NUM==num){
                    return Result.ok("新增成功","新增成功");
                }
                return Result.ok("新增失败,请联系管理员");
            }catch (Exception e){
                log.error(e.toString());
                return Result.fail("系统升级中,请稍后重试!");
            }
    }

    /**
     *
     * @param dto
     * @return
     */
    @Override
    public Result<String> updateGtData(GtVo dto) {
        try{
            String result=checkData2(dto);
            if(StringHelper.isNotEmpty(result)){
                return Result.fail(result);
            }
            int num= mapper.updateGtData(dto);
            if(SystemGlobal.SUCCESS_NUM==num){
                return Result.ok("修改成功","修改成功");
            }
            return Result.fail("修改失败,请联系管理员");
        }catch (Exception e){
            log.error(e.toString());
            return Result.fail("系统升级中,请稍后重试!");
        }
    }

    /**
     * 删除杆塔 信息
     * @param dto
     * @return
     */
    @Override
    public Result<String> deleteGt(GtVo dto) {
        try{
            String gtId=dto.getGtId();
            if(StringHelper.isEmpty(gtId)){
                return Result.ok("未选择杆塔");
            }
            AtomicBoolean isDel= new AtomicBoolean(true);
            List<String> list=Arrays.asList(gtId.split("@"));
            list.forEach(id->{
               int num= mapper.deleteGt(dto);
               if(SystemGlobal.SUCCESS_NUM!=num){
                   isDel.set(false);
               }
            });
            if(isDel.get()){
                return Result.ok("删除成功");
            }
            return Result.fail("删除失败,请联系管理员!");
        }catch (Exception e){
            log.error(e.toString());
            return Result.fail("系统升级中,请稍后重试!");
        }
    }

    @Override
    public Result<AreaVo> getAreaById(AreaDto dto) {
        try{
            AreaVo vo=mapper.getAreaById(dto);
            return Result.ok(vo);
        }catch (Exception e){
            log.error(e.toString());
            return Result.ok(new AreaVo());
        }
    }

    @Override
    public Result<GtVo> getGtById(AreaDto dto) {
        try{
            GtVo vo=mapper.getGtById(dto);
            return Result.ok(vo);
        }catch (Exception e){
            log.error(e.toString());
            return Result.ok(new GtVo());
        }
    }

    /**
     * 查询三维文件
     * @param dto
     * @return
     */
    @Override
    public List<AreaVo> getSwList(AreaDto dto) {
        return  mapper.getSwList(dto);
    }

    @Override
    public Result<String> addSwFile(MultipartFile[] files, AreaVo dto) {
        try{
            if(files==null || files.length<1){
                return Result.fail("三维文件未上传");
            }
            String result=checkData(dto);
            if(StringHelper.isNotEmpty(result)){
                return Result.fail(result);
            }
            //依据工程编码查询工程类型
            String proType=mapper.getProjectTypeByBidCode(dto.getBidCode());
            if (SystemGlobal.LINE_TYPE.equals(proType)){
                if(files.length>1){
                    return Result.fail("一个杆塔只能上传一个三维文件");
                }
                int num=mapper.getSwData(dto);
                if(num>SystemGlobal.MIN_NUM){
                    return Result.fail("该杆塔的三维文件已维护");
                }
            }
             int num=mapper.addSwFile(dto);
             if(SystemGlobal.SUCCESS_NUM!=num){
                 return Result.fail("新增失败");
             }
            Result  result1 = remoteFileService.mostUploadFile(files,SecurityConstants.INNER);
            if(result1.getCode()!=SystemGlobal.SUCCESS_CODE){
                mapper.deleteData(dto);
                Result.fail("文件服务未连接，文件上传失败");
            }
            List<Object> list= (List<Object>) result1.getData();
            Result<String>  result2= sourceFileService.addSourceList(list, dto.getId(),"三维文件","0");
            if(result2.getCode()!=SystemGlobal.SUCCESS_CODE){
                return result2;
            }
            return Result.ok("新增成功","新增成功");
        }catch (Exception e){
            log.error(e.toString(),e);
            return Result.fail("系统升级中,请稍后重试!");
        }
    }

    /**
     * 修改三维文件
     * @param files
     * @param dto
     * @return
     */
    @Override
    public Result<String> updateSwFile(MultipartFile[] files, AreaVo dto) {
        return null;
    }

    /**
     * 啥删除三维文件
     * @param dto
     * @return
     */
    @Override
    public Result<String> deleteSwFile( AreaVo dto) {
          try{
              List<FileExportVo> fileId=sourceFileService.getSourceList(dto.getId(),SystemGlobal.SW_NAME);
              if(ListHelper.isNotEmpty(fileId)){
                  fileId.forEach(file->{
                      //删除资源数据
                      sourceFileService.deleteSource(file.getFileId());
                      //删除文件
                      remoteFileService.delFile(file.getFileId(),SecurityConstants.INNER);
                  });
              }
             int num= mapper.deleteData(dto);
             if (num==SystemGlobal.SUCCESS_NUM){
                 return Result.ok("删除成功","删除成功");
             }
              return  Result.fail("删除失败");
          }catch (Exception e){
              log.error(e.toString(),e);
              return Result.fail("系统升级中,请稍后重试!");
          }
    }

    /**
     * 查询工程成本列表
     * @param dto
     * @return
     */
    @Override
    public List<ProCostVo> getProCostList(AreaDto dto) {
       return  mapper.getProCostList(dto);
    }

    /**
     * 新增工程成本
     * @param dto
     * @return
     */
    @Override
    public Result<String> addCost(ProCostVo dto) {
       try{
           String result=checkData3(dto);
           if(StringHelper.isNotEmpty(result)){
               return Result.fail(result);
           }
           dto.setCurryDay(DateTimeHelper.getNowDay());
            int num= mapper.addCost(dto);
            if(num==SystemGlobal.SUCCESS_NUM){
                return Result.ok("新增成功","新增成功");
            }
           return  Result.fail("新增失败,数据未入库");
       }catch (Exception e){
           log.error(e.toString(),e);
           return Result.fail("系统升级中,请稍后重试!");
       }
    }

    @Override
    public Result<String> updateCost(ProCostVo dto) {
        try{
            String result=checkData3(dto);
            if(StringHelper.isNotEmpty(result)){
                return Result.fail(result);
            }
            dto.setCurryDay(DateTimeHelper.getNowDay());
            int num= mapper.updateCost(dto);
            if(num==SystemGlobal.SUCCESS_NUM){
                return Result.ok("修改成功","修改成功");
            }
            return  Result.fail("修改失败,数据不存在");
        }catch (Exception e){
            log.error(e.toString(),e);
            return Result.fail("系统升级中,请稍后重试!");
        }
    }

    @Override
    public Result<String> deleteCost(ProCostVo dto) {
        try{
            int num= mapper.deleteCost(dto);
            if (num==SystemGlobal.SUCCESS_NUM){
                return Result.ok("删除成功","删除成功");
            }
            return  Result.fail("删除失败");
        }catch (Exception e){
            log.error(e.toString(),e);
            return Result.fail("系统升级中,请稍后重试!");
        }
    }

    /**
     * 数据校验
     * @param dto
     * @return
     */
    public String checkData3(ProCostVo dto){
        if(StringHelper.isEmpty(dto.getRemark())){
            return  "支出项不能为空";
        }
        if(StringHelper.isEmpty(dto.getBidCode())){
            return  "未选择工程";
        }
        if(StringHelper.isEmpty(dto.getCost())){
            return  "支出成本不能为空";
        }
        return null;
    }

    /**
     * 数据校验
     * @param dto
     * @return
     */
    public String checkData2(GtVo dto){
        if (StringHelper.isEmpty(dto.getGtName())){
            return "杆塔名称不能为空";
        }
        if (StringHelper.isEmpty(dto.getBidCode())) {
            return "请选择工程";
        }
        return null;
    }

    /**
     * 数据校验
     * @param dto
     * @return
     */
    public String checkData(AreaVo dto){
                if(StringHelper.isEmpty(dto.getAreaType())){
                    dto.setAreaType("0");
                }
                String  bidCode=dto.getBidCode();
                if (StringHelper.isEmpty(bidCode)) {
                    return "请选择工程";
                }
                //依据工程编码查询工程类型
                String proType=mapper.getProjectTypeByBidCode(bidCode);
                //线路工程
                if(SystemGlobal.LINE_TYPE.equals(proType)){
                    if(StringHelper.isEmpty(dto.getGtId())){
                        return "线路工程必须要选择杆塔";
                    }
                }
            return null;
    }

}
