package com.yiboshi.science.rest.v1;

import com.yiboshi.arch.base.ResponseDataModel;
import com.yiboshi.science.base.Pagination;
import com.yiboshi.science.config.annotation.Anonymous;
import com.yiboshi.science.config.annotation.Logs;
import com.yiboshi.science.config.bean.SystemProperties;
import com.yiboshi.science.config.security.SecurityUserHolder;
import com.yiboshi.science.entity.ComUnit;
import com.yiboshi.science.entity.SelectListItem;
import com.yiboshi.science.enumeration.CommonEnum;
import com.yiboshi.science.param.dto.ComPersonDTO;
import com.yiboshi.science.param.dto.ComUnitDTO;
import com.yiboshi.science.param.dto.UnitProjLimitDTO;
import com.yiboshi.science.param.query.ComUnitQueryVO;
import com.yiboshi.science.rest.BaseController;
import com.yiboshi.science.service.ComPersonService;
import com.yiboshi.science.service.ComUnitService;
import com.yiboshi.science.utils.StringUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.*;

/**
 * 功能：单位表 接口
 *
 * @author lkl
 * @version 2021-08-26
 */
@Api(tags = "com-unit", description = "单位表")
@RestController
@RequestMapping("/v1/science-admin/com-unit")
public class ComUnitController extends BaseController<ComUnitService, ComUnitQueryVO, ComUnitDTO, ComUnit> {

    @Autowired
    private ComUnitService comUnitService;

    @Autowired
    private ComPersonService comPersonService;

    @Autowired
    private SystemProperties properties;

    @ApiOperation(value = "1.02 分页查询", httpMethod = "GET", notes = "根据参数获取单位信息列表(分页)")
    @GetMapping
    @RequestMapping("/getListByPage")
    @PreAuthorize("hasAnyRole('GOV','ADMIN')")
    public ResponseDataModel<Pagination<ComUnitDTO>> getListByPage(@Validated ComUnitQueryVO vo, BindingResult bindingResult) {
        if (!StringUtil.isContainsRole(SecurityUserHolder.getRoles(), CommonEnum.systemRole.sys.getCode().toString())) {
            vo.setUpTreeCode(SecurityUserHolder.getUnitCode());
            vo.setAuditResult(10);
        }
        return getPaginationResponseDataModel(vo);
    }

    @ApiOperation(value = "获取单位审核列表", httpMethod = "GET", notes = "获取单位审核列表(分页)")
    @GetMapping
    @RequestMapping("/getAuditListByPage")
    @PreAuthorize("hasAnyRole('GOV')")
    public ResponseDataModel<Pagination<ComUnitDTO>> getAuditListByPage(@Validated ComUnitQueryVO vo, BindingResult bindingResult) {
        vo.setAuditResult(0);
        if (SecurityUserHolder.getUnitCode().length() != properties.getDefaultCodeLength())
            vo.setAuditUnit(SecurityUserHolder.getUnitId());
        vo.setTreeCode(SecurityUserHolder.getUnitCode());
        return getPaginationResponseDataModel(vo);
    }

    private ResponseDataModel<Pagination<ComUnitDTO>> getPaginationResponseDataModel(@Validated ComUnitQueryVO vo) {
        Pagination<ComUnitDTO> page = comUnitService.getListByPage(vo);
        if (null != page && null != page.getDataList() && page.getDataList().size() != 0) {
            page.getDataList().forEach((e) -> {
                e.setUnitTypeName(CommonEnum.unitType.getEnum(e.getUnitType()).getDescription());
                e.setUnitStateName(CommonEnum.unitState.getEnum(e.getUnitState()).getDescription());
            });
        }
        return ResponseDataModel.ok(page);
    }

    @ApiOperation(value = "获取单位信息", httpMethod = "GET", notes = "获取单位信息")
    @GetMapping
    @RequestMapping("/getUnitById")
    public ResponseDataModel<ComUnitDTO> getUnitById(String id) {
        return ResponseDataModel.ok(comUnitService.getUnitById(id));
    }

    @ApiOperation(value = "单位注册", httpMethod = "POST", notes = "单位注册")
    @RequestMapping("/register")
    @PostMapping
    @Anonymous
    @Logs(value = CommonEnum.logType.unitRegister)
    public ResponseDataModel<String> register(@Validated @RequestBody ComUnitDTO dto) {
        return ResponseDataModel.ok(comUnitService.register(dto));
    }

    @ApiOperation(value = "单位审核", httpMethod = "POST", notes = "单位审核")
    @RequestMapping("/audit")
    @PostMapping
    @Logs(value = CommonEnum.logType.unitAudit)
    public ResponseDataModel<String> audit(@Validated @RequestBody ComUnitDTO dto) {
        return ResponseDataModel.ok(comUnitService.audit(dto));
    }

    @ApiOperation(value = "新增单位", httpMethod = "POST", notes = "新增单位数据", consumes = MediaType.APPLICATION_JSON_VALUE)
    @PostMapping
    @RequestMapping("/addUnit")
    @Logs(value = CommonEnum.logType.unitAdd)
    public ResponseDataModel<String> addUnit(@Validated @RequestBody ComUnitDTO d) {
        if(Objects.isNull(d.getUpTreeCode()))
            d.setUpTreeCode(SecurityUserHolder.getUnitCode());
        return ResponseDataModel.ok(comUnitService.save(d));
    }

    @ApiOperation(value = "修改单位信息", httpMethod = "PUT", notes = "2.02 修改数据", consumes = MediaType.APPLICATION_JSON_VALUE)
    @ApiImplicitParam(dataType = "string", name = "id", value = "主键", example = "1", type = "path")
    @PutMapping(value = "updateUnit")
    @Logs(value = CommonEnum.logType.unitUpdate)
    public ResponseDataModel<String> updateUnit(@Validated @RequestBody ComUnitDTO dto) {
        return ResponseDataModel.ok(comUnitService.save(dto));
    }

    @ApiOperation(value = "修改单位状态", httpMethod = "PUT", notes = "修改单位状态", consumes = MediaType.APPLICATION_JSON_VALUE)
    @ApiImplicitParam(dataType = "string", name = "id", value = "主键", example = "1", type = "path")
    @PutMapping(value = "updateUnitState")
    @Logs(value = CommonEnum.logType.unitStateUpdate)
    public ResponseDataModel<String> updateUnitState(@Validated @RequestBody ComUnitDTO D) {
        return ResponseDataModel.ok(comUnitService.updateUnitState(D));
    }

    @ApiOperation(value = "删除单位", httpMethod = "DELETE", notes = "删除单位")
    @DeleteMapping(value = "deleteUnitById/{id}")
    @Logs(value = CommonEnum.logType.unitDelete)
    public ResponseDataModel<String> deleteUnitById(@PathVariable String id) {
        return ResponseDataModel.ok(comUnitService.deleteUnit(id));
    }

    @ApiOperation(value = "获取单位编码列表", httpMethod = "GET", notes = "获取单位编码列表")
    @GetMapping
    @RequestMapping("/getTreeCodeListByType")
    @Anonymous
    public ResponseDataModel<List<SelectListItem>> getTreeCodeListByType(ComUnitDTO unit) {
        List<SelectListItem> list = new ArrayList<>();
        List<ComUnitDTO> dtoList = comUnitService.getListByType(unit.getUnitType());
        dtoList.forEach((e) -> {
            list.add(new SelectListItem(e.getUnitName(), e.getTreeCode(),"",true, true, null));
        });
        return ResponseDataModel.ok(list);
    }

    @ApiOperation(value = "获取单位Id列表", httpMethod = "GET", notes = "获取单位Id列表")
    @GetMapping
    @RequestMapping("/getIdListByType")
    @Anonymous
    public ResponseDataModel<List<SelectListItem>> getIdListByType(ComUnitDTO unit) {
        List<SelectListItem> list = new ArrayList<>();
        List<ComUnitDTO> dtoList = comUnitService.getListByType(unit.getUnitType());
        dtoList.forEach((e) -> {
            list.add(new SelectListItem(e.getUnitName(), e.getId(),"",true, true, null));
        });
        return ResponseDataModel.ok(list);
    }

    @ApiOperation(value = "获取单位类型", httpMethod = "GET", notes = "获取单位类型")
    @GetMapping
    @RequestMapping("/getUnitType")
    @Anonymous
    public ResponseDataModel<List<SelectListItem>> getUnitTypeList() {
        List<SelectListItem> list = new ArrayList<>(CommonEnum.unitType.values().length);
        for (CommonEnum.unitType unitType : CommonEnum.unitType.values()) {
            SelectListItem item = new SelectListItem();
            item.setKey(unitType.getCode().toString());
            item.setTitle(unitType.getDescription());
            list.add(item);
        }
        return ResponseDataModel.ok(list);
    }

    @ApiOperation(value = "获取单位级别", httpMethod = "GET", notes = "获取单位级别")
    @GetMapping
    @RequestMapping("/getUnitLevel")
    @Anonymous
    public ResponseDataModel<List<SelectListItem>> getUnitLevelList() {
        List<SelectListItem> list = new ArrayList<>(CommonEnum.unitLevel.values().length);
        for (CommonEnum.unitLevel unitLevel : CommonEnum.unitLevel.values()) {
            SelectListItem item = new SelectListItem();
            item.setKey(unitLevel.getCode().toString());
            item.setTitle(unitLevel.getDescription());
            list.add(item);
        }
        return ResponseDataModel.ok(list);
    }

    @ApiOperation(value = "处理远程单位人员信息", httpMethod = "GET", notes = "处理远程单位人员信息")
    @GetMapping
    @RequestMapping("/processRemoteInfo")
    public ResponseDataModel<Map<String, Object>> processRemoteInfo(String id) {
        comUnitService.getUnitFromRemoteServer();
        comPersonService.getUserFromRemoteServer();
        ComUnitDTO ComUnit = comUnitService.getUnitById(SecurityUserHolder.getUnitId());
        Map<String, Object> info = new HashMap<String, Object>(2) {
            {
                put("roleId", SecurityUserHolder.getRoles());
                put("unit", ComUnit);
            }
        };
        return ResponseDataModel.ok(info);
    }

    @ApiOperation(value = "获取单位项目申报名额配比", httpMethod = "GET", notes = "获取单位项目申报名额配比")
    @GetMapping
    @RequestMapping("/getUnitProjLimit")
    public ResponseDataModel<List<UnitProjLimitDTO>> getUnitProjLimit(int queryType) {
        List<ComUnit> list = comUnitService.getUnitProjLimit(queryType);
        List<UnitProjLimitDTO> limitList = new ArrayList<>();
        if (null != list) {
            list.forEach((f) -> {
                UnitProjLimitDTO unit = new UnitProjLimitDTO();
                unit.setId(f.getId());
                unit.setTreeCode(f.getTreeCode());
                unit.setUnitType(f.getUnitType());
                unit.setUnitName(f.getUnitName());
                unit.setProjLimit(f.getProjLimit());
                limitList.add(unit);
            });
        }
        return ResponseDataModel.ok(limitList);
    }

    @ApiOperation(value = "更新单位项目申报配比数量", httpMethod = "PUT", notes = "更新单位项目申报配比数量", consumes = MediaType.APPLICATION_JSON_VALUE)
    @PutMapping(value = "/updateUnitProjLimit")
    public ResponseDataModel<String> updateUnitProjLimit(@RequestBody List<UnitProjLimitDTO> list) {
        if (comUnitService.updateUnitProjLimit(list))
            return ResponseDataModel.ok("单位项目申报名额配比更新成功！");
        else
            return ResponseDataModel.ok("单位项目申报名额配比更新失败！");
    }
}
