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

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.utils.MenuFrom;
import com.yeejoin.amos.boot.module.common.api.dto.FireTeamCardDto;
import com.yeejoin.amos.boot.module.common.api.dto.FireTeamListDto;
import com.yeejoin.amos.boot.module.common.api.dto.FirefightersDto;
import com.yeejoin.amos.boot.module.common.api.dto.FirefightersZhDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgMenuDto;
import com.yeejoin.amos.boot.module.common.api.entity.DataDictionary;
import com.yeejoin.amos.boot.module.common.api.entity.Firefighters;
import com.yeejoin.amos.boot.module.common.api.entity.MaintenanceCompany;
import com.yeejoin.amos.boot.module.common.api.entity.OrgUsr;
import com.yeejoin.amos.boot.module.common.api.enums.ExcelSelectData;
import com.yeejoin.amos.boot.module.common.api.excel.DataSources;
import com.yeejoin.amos.boot.module.common.api.mapper.DataDictionaryMapper;
import com.yeejoin.amos.boot.module.common.api.service.IMaintenanceCompanyService;
import com.yeejoin.amos.boot.module.common.biz.service.impl.FirefightersServiceImpl;
import com.yeejoin.amos.boot.module.common.biz.service.impl.OrgUsrServiceImpl;
import com.yeejoin.amos.boot.module.jcs.api.feign.EquipFeignClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.typroject.tyboot.core.restful.utils.ResponseModel;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class DataSourcesImpl implements DataSources {

    @Resource
    DataDictionaryMapper dataDictionaryMapper;
    @Autowired
    EquipmentServiceImpl equipmentService;
    @Autowired
    OrgUsrServiceImpl orgUsrService;
    @Autowired
    FirefightersServiceImpl firefightersService;
    @Autowired
    FireTeamServiceImpl fireTeamService;
    @Autowired
    EquipFeignClient equipFeignClient;

    @Autowired
	IMaintenanceCompanyService maintenanceCompanyService;
    
    @Autowired
    private RestTemplate restTemplate;

    @Value("${security.systemctl.name}")
    private String systemctl;

    @Override
    public String[] selectList(String type, String method) throws Exception {
        String[] str = {};
        if (StringUtils.isNotEmpty(type)) {
            str = getDataDictionary(type);
        } else {
            switch (method) {
                case "getNations":
                    str = ExcelSelectData.NATION;
                    break;
                case "getPoliticalOutlook":
                    str = ExcelSelectData.POLITICAL_OUTLOOK;
                    break;
                case "getAdministrativeDivisions":
                    // 设置请求头
                    HttpHeaders headers = new HttpHeaders();
                    headers.setContentType(MediaType.valueOf("application/json; charset=utf-8"));
                    // 用HttpEntity封装整个请求报文
                    HttpEntity<Object> httpEntity = new HttpEntity<>(null, headers);
                    ResponseEntity<String> responseEntity = restTemplate.exchange("http://" + systemctl + "/systemctl" +
                                    "/v1" +
                                    "/region/tree/parent", HttpMethod.GET,
                            httpEntity, String.class);
                    String body = responseEntity.getBody();
                    break;
                case "getBuildingList":
                    str = getBuildingList();
                    break;
                case "getFireSystemList":
                    str = getFireSystemList();
                    break;
                case "getCompanyList":
                    str = getCompanyList();
                    break;
                case "getFirefighters":
                    str = getFirefighters();
                    break;
                case "getBizCompanyList":
                    str = getBizCompanyList();
                    break;
                case "getFireTeam":
                    str = getFireTeam();
                    break;
                case "getMaritalStatus":
                    str = ExcelSelectData.MARITAL_STATUS;
                    break;
                case "getCarList":
                    str = getCarList();
                    break;
                case "getCompanyAndDeparementTree":
                	str= getCompanyAndDeparementTree();
            }
        }
        return str;
    }

    private String[] getCarList() {
        ResponseModel<Object> response = equipFeignClient.getFireCarListAll();
        List<Map<String, Object>> carList = (List<Map<String, Object>>) response.getResult();
        List<String> carNameList = Lists.newArrayList();
        carList.forEach(car -> {
            carNameList.add(car.get("name") + "(" + car.get("carNum") + ")" + "@" + car.get("id"));
        });
        String[] str = carNameList.toArray(new String[carNameList.size()]);
        return str;
    }

    private String[] getFireTeam() {
        Page<FireTeamCardDto> pageBean = new Page<>(1, Integer.MAX_VALUE);
        IPage<FireTeamCardDto> fireTeamCardDtoIPage = fireTeamService.listFireTeamByPage(pageBean,
                new FireTeamListDto());
        List<FireTeamCardDto> records = fireTeamCardDtoIPage.getRecords();
        List<String> names = records.stream().map(item -> {
            return item.getName() + "@" + item.getSequenceNbr();
        }).collect(Collectors.toList());
        String[] str = names.toArray(new String[names.size()]);
        return str;
    }

    private String[] getBizCompanyList() throws Exception {
        List<OrgMenuDto> orgUsrTree = orgUsrService.getTree(null, orgUsrService.selectCompanyDepartmentMsg(),
                OrgUsr.class.getName(), "getSequenceNbr", 2, "getBizOrgName", "getParentId", "getBizOrgType");
        List<String> stringList = new ArrayList<String>();
        initBizCompanyList(orgUsrTree, stringList);
        String[] str = stringList.toArray(new String[stringList.size()]);
        return str;
    }

    private void initBizCompanyList(List<OrgMenuDto> orgUsrTree, List<String> stringList) {
        for (OrgMenuDto orgMenuDto : orgUsrTree) {
            stringList.add(orgMenuDto.getName() + "@" + orgMenuDto.getKey() + "@" + orgMenuDto.getBizOrgCode());
            List<OrgMenuDto> children = orgMenuDto.getChildren();
            if (children != null && children.size() > 0) {
                initCompanyList(children, stringList);
            }
        }
    }

    private String[] getFirefighters() {
        List<FirefightersZhDto> firefighters = firefightersService.getFirefighters(1, Integer.MAX_VALUE,
                new FirefightersDto());
        List<String> names = firefighters.stream().map(item -> {
            return item.getName() + "@" + item.getSequenceNbr();
        }).collect(Collectors.toList());
        String[] str = names.toArray(new String[names.size()]);
        return str;
    }

    private String[] getCompanyList() throws Exception {
        List<OrgMenuDto> orgUsrTree = orgUsrService.getTree(null, orgUsrService.selectCompanyDepartmentMsg(),
                OrgUsr.class.getName(), "getSequenceNbr", 2, "getBizOrgName", "getParentId", "getBizOrgType");
        List<String> stringList = new ArrayList<String>();
        initCompanyList(orgUsrTree, stringList);
        String[] str = stringList.toArray(new String[stringList.size()]);
        return str;
    }

    private void initCompanyList(List<OrgMenuDto> orgUsrTree, List<String> stringList) {
        for (OrgMenuDto orgMenuDto : orgUsrTree) {
            stringList.add(orgMenuDto.getName() + "@" + orgMenuDto.getKey());
            List<OrgMenuDto> children = orgMenuDto.getChildren();
            if (children != null && children.size() > 0) {
                initCompanyList(children, stringList);
            }
        }
    }

    private String[] getFireSystemList() {
        List<MenuFrom> fireSystemList = equipmentService.getFireSystemList();
        List<String> names = fireSystemList.stream().map(item -> {
            return item.getName() + "@" + item.getKey();
        }).collect(Collectors.toList());
        String[] str = names.toArray(new String[names.size()]);
        return str;
    }

    private String[] getBuildingList() {
        List<MenuFrom> buildingList = equipmentService.getBuildingList();
        List<String> buildingNames = buildingList.stream().map(item -> {
            return item.getName() + "@" + item.getKey();
        }).collect(Collectors.toList());
        String[] str = buildingNames.toArray(new String[buildingNames.size()]);
        return str;
    }

    private String[] getDataDictionary(String type) {
        QueryWrapper<DataDictionary> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("type", type);
        queryWrapper.orderByAsc("sort_num");
        List<DataDictionary> list = dataDictionaryMapper.selectList(queryWrapper);
        List<String> names = list.stream().map(dataDictionary -> {
            return dataDictionary.getName() + "@" + dataDictionary.getCode();
        }).collect(Collectors.toList());
        String[] str = names.toArray(new String[names.size()]);
        return str;
    }
  private String[] getCompanyAndDeparementTree() throws Exception {
	  List<OrgMenuDto> menus = orgUsrService.getTree(null,
				maintenanceCompanyService.getCompanyAndDepartmentTree(), MaintenanceCompany.class.getName(),
				"getSequenceNbr", 2, "getName", "getParentId", "getType");
	  List<String> stringList = new ArrayList<String>();
      initCompanyList(menus, stringList);
      String[] str = stringList.toArray(new String[stringList.size()]);
      return str;
	  
  }
}
