package com.starcharge.wios.controller;

import com.ihidea.component.api.v2.BaseResponse;
import com.ihidea.core.support.exception.ServiceException;
import com.ihidea.core.support.session.SessionInfo;
import com.starcharge.wios.auth.service.TokenService;
import com.starcharge.wios.convert.TauxiliarymaterialsConvert;
import com.starcharge.wios.dao.entity.Tauxiliarymaterials;
import com.starcharge.wios.dao.entity.TauxiliarymaterialsAdd;
import com.starcharge.wios.dao.entity.TauxiliarymaterialsCriteria;
import com.starcharge.wios.dao.mappers.TauxiliarymaterialsMapper;
import com.starcharge.wios.dto.TauxiliarymaterialsCheckDto;
import com.starcharge.wios.enums2.TauxiliarymaterialStatusEnum;
import com.starcharge.wios.utils.ExcelUtils;
import com.starcharge.wios.validation.CreateEntityGroup;
import com.starcharge.wios.validation.ParamsValidate;
import com.starcharge.wios.vo.TauxiliarymaterialsExcelVo;
import com.starcharge.wios.vo.TauxiliarymaterialsVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.var;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @projectName:xr-wios
 * @packageName:com.starcharge.wios.controller
 * @Description:TODO
 * @Author:luyincheng
 * @CreateDate: 2023/9/25 14:50
 */
@RestController
@RequestMapping("api/tauxiliarymaterials")
@Api(tags = "辅材管理接口")
public class TauxiliarymaterialsController {
    @Autowired
    private TokenService tokenService;
    @Autowired
    private TauxiliarymaterialsMapper tauxiliarymaterialsMapper;

    public void UpdateColumns(Tauxiliarymaterials tauxiliarymaterials){
        SessionInfo sessionInfo = tokenService.getUser();
        tauxiliarymaterials.setUpdatedBy(sessionInfo.getUserId());
        tauxiliarymaterials.setUpdatedTime(LocalDateTime.now());
    }


    @PostMapping("/add")
    @ApiOperation("新增辅材申请")
    @ParamsValidate
    public BaseResponse<Void> AddTauxiliarymaterials(@RequestBody @Validated(CreateEntityGroup.class) TauxiliarymaterialsAdd tauxiliarymaterialsAdd, BindingResult bindingResult){
        SessionInfo sessionInfo = tokenService.getUser();
        var now=LocalDateTime.now();
        tauxiliarymaterialsAdd.setApplyStatus(TauxiliarymaterialStatusEnum.已申请.name());
        tauxiliarymaterialsAdd.setLogisticStatus(TauxiliarymaterialStatusEnum.未发货.name());
        tauxiliarymaterialsAdd.setReceivingStatus(TauxiliarymaterialStatusEnum.未收货.name());
        tauxiliarymaterialsAdd.setApplyTime(now);
        tauxiliarymaterialsAdd.setCreatedBy(sessionInfo.getUserId());
        tauxiliarymaterialsAdd.setCreatedTime(now);
        tauxiliarymaterialsAdd.setUpdatedBy(sessionInfo.getUserId());
        tauxiliarymaterialsAdd.setUpdatedTime(now);
        //暂时代替申请单号
//        tauxiliarymaterials.setApplyOrder(IdWorker.getIdStr());
        tauxiliarymaterialsMapper.insertSelective(tauxiliarymaterialsAdd);
        return new BaseResponse<>();
    }
    @GetMapping("/detail")
    @ApiOperation(value = "查询辅材申请详情")
    public BaseResponse<Tauxiliarymaterials> detail(@RequestParam int id){
        return new BaseResponse(this.tauxiliarymaterialsMapper.selectByPrimaryKey(id));
    }

    @PostMapping("/query")
    @ApiOperation(value = "查询辅材申请列表",notes = "属性不为空即为查询条件")
    public BaseResponse<List<Tauxiliarymaterials>> queryTauxiliarymaterialsList(Tauxiliarymaterials tauxiliarymaterials){
        return new BaseResponse(this.tauxiliarymaterialsMapper.selectTAuxiliaryMaterialsList(tauxiliarymaterials));
    }
    @PostMapping("/delete")
    @ApiOperation(value = "删除辅材申请")
    public BaseResponse<Boolean> deleteTauxiliarymaterials(@RequestParam int id){
        return new BaseResponse(this.tauxiliarymaterialsMapper.deleteByPrimaryKey(id)>0);
    }
    @PostMapping("/updateinfo")
    @ApiOperation(value = "更新辅材申请信息")
    public BaseResponse<Boolean> updateTauxiliarymaterialsInfo(@RequestBody TauxiliarymaterialsVo tauxiliarymaterials){
        if(tauxiliarymaterials.getId()==null||tauxiliarymaterials.getId()<=0){
            throw new ServiceException("400","id不能为空");
        }
        var updateDto=new Tauxiliarymaterials();
        BeanUtils.copyProperties(tauxiliarymaterials,updateDto);
        UpdateColumns(updateDto);
        return new BaseResponse(this.tauxiliarymaterialsMapper.updateByPrimaryKeySelective(updateDto)>0);
    }
    @GetMapping("/updatestatus")
    @ApiOperation(value = "更新辅材申请状态")
    public BaseResponse<Boolean> updateStatus(@RequestParam int id,
                                @RequestParam(required = false) @ApiParam("发货状态:未发货,已发货;可为空") String logisticStatus,
                                @RequestParam(required = false) @ApiParam("收货状态:未收货, 已收货;可为空")String receivingStatus,
                                @RequestParam(required = false) @ApiParam("申请状态:已申请,已驳回,已通过,已关闭;可为空")String applyStatus){
        if(StringUtils.isEmpty(logisticStatus)&&StringUtils.isEmpty(receivingStatus)&&StringUtils.isEmpty(applyStatus)){
            throw new ServiceException("400","至少更新一种状态");
        }
        var ta=new Tauxiliarymaterials();
        ta.setId(id);
        ta.setApplyStatus(TauxiliarymaterialStatusEnum.getEnumNameByName(0,applyStatus));
        ta.setLogisticStatus(TauxiliarymaterialStatusEnum.getEnumNameByName(1,logisticStatus));
        ta.setReceivingStatus(TauxiliarymaterialStatusEnum.getEnumNameByName(2,receivingStatus));
        UpdateColumns(ta);

        return new BaseResponse(this.tauxiliarymaterialsMapper.updateByPrimaryKeySelective(ta)>0);
    }
    @PostMapping("/check")
    @ApiOperation(value = "批量审批")
    @Transactional
    public BaseResponse<Boolean> checkApply(@RequestBody TauxiliarymaterialsCheckDto tauxiliarymaterialsCheckDto){
        SessionInfo sessionInfo = tokenService.getUser();
        tauxiliarymaterialsCheckDto.getTauxiliarymaterialsCheckVoList().stream()
                .filter(dto->{
                    var exist=this.tauxiliarymaterialsMapper.selectByPrimaryKey(dto.getId());
                    if(exist==null){
                        return false;
                    }else{
                        //已审批
                        if(TauxiliarymaterialStatusEnum.getEnumByName(0,exist.getApplyStatus()).getValue()>1){
                            return false;
                        }
                    }
                    return true;
                })
                .map(dto->{
                    var ta=new Tauxiliarymaterials();
                    ta.setId(dto.getId());
                    ta.setApprovedQuantity(dto.getApprovedQuantity());
                    ta.setApplyStatus(tauxiliarymaterialsCheckDto.getApplyStatus());
                    ta.setCheckSuggestion(tauxiliarymaterialsCheckDto.getCheckSuggestion());
                    ta.setCheckUser(sessionInfo.getUserId());
                    ta.setCheckUserName(sessionInfo.getUserName());
                    ta.setCheckTime(LocalDateTime.now());
                    UpdateColumns(ta);
                    return ta;
                }).forEach(ta->{
                    this.tauxiliarymaterialsMapper.updateByPrimaryKeySelective(ta);
                });
        return new BaseResponse(true);
    }
    @GetMapping("/bindLogisticOrder")
    @ApiOperation(value = "绑定物流单号")
    public BaseResponse<Boolean> bindLogisticOrder(@RequestParam @ApiParam("辅材申请单id") int id,@RequestParam @ApiParam("物流单号") String logisticOrder){
        var dto=new Tauxiliarymaterials();
        dto.setId(id);
        dto.setLogisticOrder(logisticOrder);
        dto.setLogisticStatus(TauxiliarymaterialStatusEnum.已发货.name());
        return new BaseResponse(this.tauxiliarymaterialsMapper.updateByPrimaryKeySelective(dto)>0);
    }

    @PostMapping("/export")
    @ApiOperation(value = "导出辅料申请列表")
    public void export(HttpServletResponse response,@RequestBody Tauxiliarymaterials tauxiliarymaterials) throws IOException {

//        ExcelUtil<WarehouseInfo> util = new ExcelUtil<WarehouseInfo>(WarehouseInfo.class);
//        util.exportExcel(response, list, "仓库信息管理数据");
        List<TauxiliarymaterialsExcelVo> data = TauxiliarymaterialsConvert.INSTANCE.convertList(this
                .tauxiliarymaterialsMapper.selectTAuxiliaryMaterialsList(tauxiliarymaterials));
        // 输出
        ExcelUtils.write(response, "辅材申请列表.xls", "辅材信息", TauxiliarymaterialsExcelVo.class, data);
    }
    @GetMapping("/getRecent3MonthHasChecked")
    @ApiOperation(value = "查询最近三个月已审批物料申请单")
    public BaseResponse<List<Tauxiliarymaterials>> getRecent3MonthHasChecked(@RequestParam @ApiParam("物料编码") String materialCode){
        TauxiliarymaterialsCriteria criteria=new TauxiliarymaterialsCriteria();
        criteria.createCriteria().andApplyTimeGreaterThanOrEqualTo(LocalDateTime.now().minusMonths(3))
                .andMaterialCodeEqualTo(materialCode)
                .andApplyStatusEqualTo(TauxiliarymaterialStatusEnum.已通过.name());
        return new BaseResponse<>(this.tauxiliarymaterialsMapper.selectByExample(criteria));
    }
}