package com.yeejoin.amos.boot.module.ugp.biz.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.module.common.api.entity.OrgUsr;
import com.yeejoin.amos.boot.module.ugp.api.Enum.OrgEnum;
import com.yeejoin.amos.boot.module.ugp.api.Enum.ProjectInitiationEnum;
import com.yeejoin.amos.boot.module.ugp.api.constants.XJConstant;
import com.yeejoin.amos.boot.module.ugp.api.dto.ProjectDto;
import com.yeejoin.amos.boot.module.ugp.api.dto.ProjectProcessDto;
import com.yeejoin.amos.boot.module.ugp.api.entity.*;
import com.yeejoin.amos.boot.module.ugp.api.mapper.ProjectMapper;
import com.yeejoin.amos.boot.module.ugp.api.mapper.ProjectResourceMapper;
import com.yeejoin.amos.boot.module.ugp.api.mapper.SuperviseRuleMapper;
import com.yeejoin.amos.boot.module.ugp.api.service.IProjectService;
import com.yeejoin.amos.boot.module.ugp.biz.framework.BusinessIdentify;
import com.yeejoin.amos.component.feign.model.FeignClientResult;
import com.yeejoin.amos.feign.privilege.Privilege;
import com.yeejoin.amos.feign.privilege.model.AgencyUserModel;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;

import java.math.BigDecimal;
import java.util.*;

/**
 * 项目信息表服务实现类
 *
 * @author system_generator
 * @date 2022-09-22
 */
@Service
public class ProjectServiceImpl extends BaseService<ProjectDto, Project, ProjectMapper> implements IProjectService {

    @Autowired
    ProjectMapper projectMapper;

    @Autowired
    ProjectResourceServiceImpl projectResourceService;

    @Autowired
    AttachmentServiceImpl attachmentService;

    @Autowired
    ProjectInitiationServiceImpl projectInitiationService;

    @Autowired
    EquipmentServiceImpl equipmentService;

    @Autowired
    OrgServiceImpl orgService;

    @Autowired
    SuperviseRuleServiceImpl superviseRuleService;

    @Autowired
    ProjectResourceMapper projectResourceMapper;

    @Autowired
    AttachmentServiceImpl attachmentServiceImpl;

    @Autowired
    WeldServiceImpl weldServiceImpl;
    @Autowired
    SuperviseRuleMapper superviseRuleMapper;
    /**
     * 分页查询
     */
    public Page<ProjectDto> queryForProjectPage(Page<ProjectDto> page ,String name,String constructionUnit) {
        Page<ProjectDto> projectDtoPage = this.queryForPage(page, null, false,name,constructionUnit);
        List<ProjectDto> projects = projectDtoPage.getRecords();
        for(ProjectDto project:projects){
            getProjectState(project);
        }
        return projectDtoPage;
    }

    private void getProjectState(ProjectDto project) {
        String state = "",insDep = "",insPerson = "",insDepId = "";
        //新立项的项目 分支流程原因还没有instanceId 默认给值
        if(ValidationUtil.isEmpty(project.getInstanceId())){
            state=ProjectInitiationEnum.平台审核.getTaskDetailStatus();
        }

        LambdaQueryWrapper<ProjectInitiation> lambdaQueryWrap = new LambdaQueryWrapper<>();
        lambdaQueryWrap.eq(ProjectInitiation::getInstanceId,project.getInstanceId())
//                .eq(ProjectInitiation ::getTaskName, ProjectInitiationEnum.平台审核.getName())
                .orderByDesc(ProjectInitiation::getSequenceNbr);

        List<ProjectInitiation> projectInitiationList = projectInitiationService.list(lambdaQueryWrap);
        if(!ValidationUtil.isEmpty(projectInitiationList)){
            ProjectInitiation projectInitiation = projectInitiationList.iterator().next();
            JSONObject jsonObject = JSON.parseObject(projectInitiation.getContext());
            if(ProjectInitiationEnum.审批人审批.getName().equals(project.getStatus()) || ProjectInitiationEnum.审核人审核.getName().equals(project.getStatus()) || ProjectInitiationEnum.监检科室分配.getName().equals(project.getStatus()) || ProjectInitiationEnum.监检员分配.getName().equals(project.getStatus()) || ProjectInitiationEnum.监检员审核.getName().equals(project.getStatus()) || ProjectInitiationEnum.流程结束.getName().equals(project.getStatus()) || ProjectInitiationEnum.项目关闭.getName().equals(project.getStatus())){
                if(!ValidationUtil.isEmpty(jsonObject)){
                    insDepId = jsonObject.getString(XJConstant.INS_DEPID);
                    state = jsonObject.getString(XJConstant.PROCESS_PROJECT_STATE);
                    insDep = jsonObject.getString(XJConstant.INS_DEP);
                    insPerson = jsonObject.getString(XJConstant.INS_PRESON);
                }
            } else {
                state = ProjectInitiationEnum.getTaskDetailStatusMap.get(project.getStatus());
            }
        }
//        if(ProjectInitiationEnum.平台审核.getName().equals(project.getStatus())){
//            if(ValidationUtil.isEmpty(state)){
//                state = "项目待审核";
//            }
//        } else if (ProjectInitiationEnum.告知申请.getName().equals(project.getStatus())){
//            if(ValidationUtil.isEmpty(state)){
//                state = "告知待申请";
//            }
//        } else if (ProjectInitiationEnum.接受告知.getName().equals(project.getStatus())){
//            if(ValidationUtil.isEmpty(state)){
//                state = "告知待接收";
//            }
//        } else if (ProjectInitiationEnum.审查项目.getName().equals(project.getStatus())){
//            if(ValidationUtil.isEmpty(state)){
//                state = "告知待接收";
//            }
//        } else if (ProjectInitiationEnum.提交资料.getName().equals(project.getStatus())){
//            if(ValidationUtil.isEmpty(state)){
//                state = "资料待上传";
//            }
//        } else if(ProjectInitiationEnum.项目立项.getName().equals(project.getStatus())){
//            if(ValidationUtil.isEmpty(state)){
//                state = "项目被驳回";
//            }
//        }

        project.setExamineProjectState(state);
        project.setInsDep(insDep);
        project.setInsPerson(insPerson);
        project.setInsDepId(insDepId);

    }


    /**
     * 列表查询 示例
     */
    public List<ProjectDto> queryForProjectList() {
        return this.queryForList("", false);
    }

    /**
     * 查询项目名称
     */
    @BusinessIdentify
    public List<JSONObject> selectName() {
        List<JSONObject> names = new ArrayList<>();

        Long companySequenceNbr = orgService.getReginParams().getBusinessInfo().getCompanySequenceNbr();
        LambdaQueryWrapper<Project> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Project::getCompanyId,companySequenceNbr);
        //查询所有项目
        List<Project> projects = projectResourceService.getProjectList();
        for (Project i : projects) {
            JSONObject name = new JSONObject();
            name.put("name", i.getName());
            name.put("sequenceNbr", i.getSequenceNbr());
            names.add(name);
        }

        return names;
    }


    /**
     * 通过多个主键sequence_nbr查询数据
     * @param ids
     * @return
     */
    public List<Project> selectByidList(List<Long> ids){
        return projectMapper.selectBatchIds(ids);
    }

    @BusinessIdentify
    public ProjectDto getDetail(Long sequenceNbr){

        ProjectDto project = projectMapper.getDetail(sequenceNbr);
        LambdaQueryWrapper<Attachment> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Attachment::getSourceId,sequenceNbr);
        Attachment attachment = attachmentService.getOne(wrapper);
//        try{
        JSONObject jsonObject = null;
        if(!ValidationUtil.isEmpty(attachment)){
            jsonObject  =  JSON.parseObject(attachment.getInfo());
        }


        JSONArray installSubForm = JSON.parseArray(XJConstant.INSTALL_SUB_FORM);
        JSONArray designSubForm = JSON.parseArray(XJConstant.DESIGN_SUB_FORM);

        if(!ValidationUtil.isEmpty(jsonObject)){
            installSubForm = jsonObject.getJSONArray("installSubForm");
            designSubForm = jsonObject.getJSONArray("designSubForm");
        }
        project.setInstallSubForm(installSubForm);
        project.setDesignSubForm(designSubForm);
//            project.setSubForm(jsonArray);
//        }catch (Exception e) {
//            System.out.println("该项目暂无附件");
//        }
        project.getInstanceId();
        getProjectState(project);

        project.setCompanyType(orgService.getReginParams().getBusinessInfo().getCompanyType());
        return project;
    }


    public String saveOrUpdateFile(JSONObject jsonObject){
        JSONArray installSubForm = jsonObject.getJSONArray("installSubForm");
        JSONArray designSubForm = jsonObject.getJSONArray("designSubForm");
        JSONObject subForm = new JSONObject();
        subForm.put("installSubForm",installSubForm);
        subForm.put("designSubForm",designSubForm);
        Long sequenceNbr = jsonObject.getLong("sequenceNbr");
        LambdaQueryWrapper<Attachment> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Attachment::getSourceId,sequenceNbr);
        Attachment attachment = attachmentService.getOne(wrapper);
        if(ValidationUtil.isEmpty(attachment)){
            equipmentService.saveProjectAttachment(subForm,sequenceNbr);
        }else {
            attachment.setInfo(JSON.toJSONString(subForm));
            attachmentService.updateById(attachment);
        }
        if(ValidationUtil.isEmpty(jsonObject.getString(XJConstant.PROCESS_PROJECT_STATE))){
            jsonObject.put(XJConstant.PROCESS_PROJECT_STATE,"资料已上传");
        }
        Project project = this.getById(sequenceNbr);
        ProjectDto projectDto = new ProjectDto();
        BeanUtils.copyProperties(project,projectDto);
        projectDto.setInsDep(jsonObject.getString("insDep"));
        projectDto.setInsDep(jsonObject.getString("insPerson"));
        projectDto.setProcessProjectState(jsonObject.getString(XJConstant.PROCESS_PROJECT_STATE));
        boolean design=false,install=false;
        for(Object object:installSubForm){
            JSONObject jo = JSON.parseObject(JSON.toJSONString(object));
            String type = jo.getString("type");
            String info = jo.getString("info");
            if (OrgEnum.安装单位.getName().equals(type) && !ValidationUtil.isEmpty(info)){
                install=true;
            }else {
                install=false;
                break;
            }
        }
        for(Object object:designSubForm){
            JSONObject jo = JSON.parseObject(JSON.toJSONString(object));
            String type = jo.getString("type");
            String info = jo.getString("info");
            if (OrgEnum.设计单位.getName().equals(type) && !ValidationUtil.isEmpty(info)){
                design=true;
            }else {
                design=false;
                break;
            }
        }

        //若为null则为保存 不执行流程
        String type = jsonObject.getString("type");
        if (!ValidationUtil.isEmpty(type)) {
            if (design && install) {
                projectInitiationService.execute(project.getInstanceId(), projectDto, "1");
                return "over";
            }else {
                return "fail";
            }
        }
        return "ok";
    }

//    //项目模糊筛选
//    @Override
//    public Page<ProjectDto> queryProjectPage(Page<ProjectDto> page, Project project) {
//        Page<ProjectDto> projectDtoPage = projectMapper.queryProjectPage(page,project);
//        List<ProjectDto> projects = projectDtoPage.getRecords();
//        for(ProjectDto projectDto:projects){
//            getProjectState(projectDto);
//        }
//        return projectDtoPage;
//    }




    //项目模糊筛选

//    @BusinessIdentify
//    @Override
//    public IPage<ProjectDto> queryProjectPage(String current,String size, Project project) {
//        IPage<ProjectDto> page = new Page<>();
//        page.setCurrent(Long.parseLong(current));
//        page.setSize(Long.parseLong(size));
//        ReginParams reginParams = orgService.getReginParams();
//        String companyId = String.valueOf(reginParams.getBusinessInfo().getCompanySequenceNbr());
//        String roleName = reginParams.getRole().getRoleName();
//        LambdaQueryWrapper<SuperviseRule> wrapper = new LambdaQueryWrapper<>();
//        String reginCode = "";
//        if(OrgEnum.监察部门.getName().equals(roleName)){
//            wrapper.eq(SuperviseRule::getSuperviseDeptId,companyId);
//            reginCode = superviseRuleService.getOne(wrapper).getAdminRegion();
//        } else if(OrgEnum.监检机构.getName().equals(roleName)){
//            wrapper.eq(SuperviseRule::getInspectionUnitId,companyId);
//            reginCode = superviseRuleService.getOne(wrapper).getAdminRegion();
//        } else {
//            page =  projectMapper.queryProjectPage(page, project, roleName, companyId);
//        }
//        if(!ValidationUtil.isEmpty(reginCode)){
//            page = projectMapper.queryProjectPage(page, project, roleName, reginCode);
//        }
//        List<ProjectDto> projects = page.getRecords();
//        for(ProjectDto projectDto:projects){
//            getProjectState(projectDto);
//        }
//        return page;
//    }
//

    @BusinessIdentify
    @Override
    public IPage<ProjectDto> queryProjectPage(String current,String size, Project project) {
        IPage<ProjectDto> page = new Page<>();
        page.setCurrent(Long.parseLong(current));
        page.setSize(Long.parseLong(size));
        ReginParams reginParams = orgService.getReginParams();
        String companyId = String.valueOf(reginParams.getBusinessInfo().getCompanySequenceNbr());
        String roleName = reginParams.getRole().getRoleName();
        LambdaQueryWrapper<SuperviseRule> wrapper = new LambdaQueryWrapper<>();
        Set<String> codes = new HashSet<>();
        if(OrgEnum.监察部门.getName().equals(roleName)){
            wrapper.eq(SuperviseRule::getSuperviseDeptId,companyId);
            List<SuperviseRule> superviseRuleList = superviseRuleService.list(wrapper);
            for (SuperviseRule superviseRule :superviseRuleList){
                codes.add(String.valueOf(superviseRule.getAdminRegionCode()));
            }
        } else if(OrgEnum.监检机构.getName().equals(roleName)){
            wrapper.eq(SuperviseRule::getInspectionUnitId,companyId);
            List<SuperviseRule> superviseRuleList = superviseRuleService.list(wrapper);
            for (SuperviseRule superviseRule :superviseRuleList){
                codes.add(String.valueOf(superviseRule.getAdminRegionCode()));
            }
        } else {
            page =  projectMapper.queryProjectPage(page, project, roleName, companyId,codes);
        }
        if(!ValidationUtil.isEmpty(codes)){
            page = projectMapper.queryProjectPage(page, project, roleName,companyId,codes);
        }
        List<ProjectDto> projects = page.getRecords();
        for(ProjectDto projectDto:projects){
            getProjectState(projectDto);
            }
        List<ProjectDto> projectDtoList = getPage(projects);
        page.setRecords(projectDtoList);
        return page;
    }

   public List<ProjectDto> getPage(List<ProjectDto> projects){
       ArrayList<ProjectDto> list = Lists.newArrayList();
       for(ProjectDto projectDto:projects){
           if (ProjectInitiationEnum.监检员分配.getName().equals(projectDto.getStatus())) {
               if (!ValidationUtil.isEmpty(projectDto.getContext()) && JSONObject.parseObject(projectDto.getContext()).containsKey("insDepId")) {
                   String insDepId = JSONObject.parseObject(projectDto.getContext()).getString("insDepId");
                   if (!ValidationUtil.isEmpty(insDepId)) {
                       Map map = orgService.getdetialInfo(insDepId);
                       String fieldValue = (String)map.get("charge");
                       OrgUsr orgUsr = orgService.getOrgUsrById(fieldValue);
                       FeignClientResult<List<AgencyUserModel>> listFeignClientResult = Privilege.agencyUserClient.queryByRealName(orgUsr.getBizOrgName());
                       List<AgencyUserModel> resultList = listFeignClientResult.getResult();
                       for (AgencyUserModel agencyUserModel : resultList) {
                           String userId=agencyUserModel.getUserId();
                           projectDto.setUserId(userId);
                       }
                   }
               }
               list.add(projectDto);
           }else if (!ValidationUtil.isEmpty(projectDto.getContext()) && ProjectInitiationEnum.监检员审核.getName().equals(projectDto.getStatus())) {
               if (JSONObject.parseObject(projectDto.getContext()).containsKey("insPerson")) {
                   String insPerson = JSONObject.parseObject(projectDto.getContext()).getString("insPerson");
                   if (!ValidationUtil.isEmpty(insPerson)) {
                       FeignClientResult<List<AgencyUserModel>> listFeignClientResult = Privilege.agencyUserClient.queryByRealName(insPerson);
                       List<AgencyUserModel> resultList = listFeignClientResult.getResult();
                       for (AgencyUserModel agencyUserModel : resultList) {
                           String userId=agencyUserModel.getUserId();
                           projectDto.setUserId(userId);
                       }
                   }
               }
               list.add(projectDto);
           } else {
               list.add(projectDto);
           }
       }
       return list;
   }
    @BusinessIdentify
    public List<Map<String, String>> projectSchedule() {
        List<Project> projectList = projectResourceService.getProjectList();
        Set<Long> projectIds = new HashSet<>();
        if(!ValidationUtil.isEmpty(projectList)){
            for (Project project :projectList){
                projectIds.add(project.getSequenceNbr());
            }
        }
        return projectMapper.getProjectComplete(projectIds);
    }

    public List<Map<String,String>> projectOverview() {
        List<Map<String,String>> list = new LinkedList<>();
        ReginParams ReginParams = orgService.getReginParams();
        String companyType = ReginParams.getBusinessInfo().getCompanyType();
        Long companyId = ReginParams.getBusinessInfo().getCompanySequenceNbr();
        if (OrgEnum.监察部门.getKey().equals(companyType)) {
            Map<String,String> map1 = new HashMap<>();
            Map<String,String> map2 = new HashMap<>();
            String aLong1 = projectMapper.projectBuiltDept(companyId);
            String aLong2 = projectMapper.projectUnderConstructionDept(companyId);
            map1.put("name","已建");
            map1.put("value",aLong1);
            map2.put("name","在建");
            map2.put("value",aLong2);
            list.add(map1);
            list.add(map2);
            return list;
        } else if (OrgEnum.监检机构.getKey().equals(companyType)) {
            Map<String,String> map1 = new HashMap<>();
            Map<String,String> map2 = new HashMap<>();
            String aLong1 = projectMapper.projectBuiltUnit(companyId);
            String aLong2 = projectMapper.projectUnderConstructionUnit(companyId);
            map1.put("name","已建");
            map1.put("value",aLong1);
            map2.put("name","在建");
            map2.put("value",aLong2);
            list.add(map1);
            list.add(map2);
            return list;
        }
        return null;
    }

    @BusinessIdentify
    public JSONObject projectInProgress() {
        JSONObject object = new JSONObject();
        ArrayList<String> axisData = Lists.newArrayList();
        ArrayList<Integer> seriesData = Lists.newArrayList();
        ReginParams reginParams = orgService.getReginParams();
        String roleName = reginParams.getRole().getRoleName();
        Long companyId = reginParams.getBusinessInfo().getCompanySequenceNbr();
        LambdaQueryWrapper<SuperviseRule> wrapper = new LambdaQueryWrapper<>( );
        LambdaQueryWrapper<Project> wrapper1 = new LambdaQueryWrapper<>();

                List<Project> list = projectResourceService.getProjectList();
                for (Project project : list) {
                    ProjectProcessDto projectProcessDto = projectMapper.getProjectProcessDto(project.getSequenceNbr());
                    axisData.add(projectProcessDto.getProjectName());
                    seriesData.add(getProjectProcess(projectProcessDto));
                }

        object.put("axisData",axisData);
        object.put("seriesData",seriesData);
        return object;
    }



    public Integer getProjectProcess(ProjectProcessDto projectProcessDto)
    {
        Double projectProcess = projectProcessDto.getProjectProcess();
        if (projectProcess.compareTo(1.0) == 0 || projectProcess.compareTo(1.0) == 1) {
            return 100;
        }
        Integer  pass = new BigDecimal(projectProcess).multiply (new BigDecimal (100)).intValue();
        return Integer.valueOf(pass);
    }

    /**
     * 获取当前登陆人所在单位下的项目的项目信息（包含经纬度信息）
     * @return
     */
    public List<ProjectDto> getProjectLocation(){
        List<Project> projectList = projectResourceService.getProjectList();
        List<ProjectDto> projectDtoList = new ArrayList<>();
        if(!ValidationUtil.isEmpty(projectList)){
            for (Project project : projectList) {
                ProjectDto projectDto = new ProjectDto();
                BeanUtils.copyProperties(project,projectDto);
                List<Weld> weldList = weldServiceImpl.list(new LambdaQueryWrapper<Weld>().eq(Weld::getProjectId,project.getSequenceNbr()));
                if(!ValidationUtil.isEmpty(weldList)){
                    for (Weld weld : weldList) {
                        String longitude = weld.getLongitude();
                        String latitude = weld.getLatitude();
                        if (!ValidationUtil.isEmpty(longitude) && !ValidationUtil.isEmpty(latitude)) {
                            projectDto.setLongitude(longitude);
                            projectDto.setLatitude(latitude);
                            break;
                        }
                    }
                }
                projectDtoList.add(projectDto);
            }
        }
        return projectDtoList;
    }
}