package com.jsh.erp.controller.pda;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.jsh.erp.base.AjaxResult;
import com.jsh.erp.base.BaseController;
import com.jsh.erp.base.TableDataInfo;
import com.jsh.erp.datasource.entities.DepotHead;
import com.jsh.erp.datasource.entities.Supplier;
import com.jsh.erp.datasource.entities.TaskStocktakingItem;
import com.jsh.erp.datasource.entities.User;
import com.jsh.erp.datasource.pda.dto.PDADepotHeadDTO;
import com.jsh.erp.datasource.pda.dto.PDATaskStocktakingDTO;
import com.jsh.erp.datasource.pda.vo.PDADepotHeadVO;
import com.jsh.erp.datasource.pda.vo.PDADepotItemVO;
import com.jsh.erp.datasource.pda.vo.PDATaskStocktakingItemVO;
import com.jsh.erp.datasource.pda.vo.PDATaskStocktakingVO;
import com.jsh.erp.datasource.vo.TaskStocktakingVO;
import com.jsh.erp.query.LambdaQueryWrapperX;
import com.jsh.erp.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping(value = "/pda")
@Api(tags = {"PDA接口"})
public class PdaController extends BaseController {

    @Resource
    private DepotHeadService depotHeadService;

    @Resource
    private DepotItemService depotItemService;

    @Resource
    private SupplierService supplierService;

    @Resource
    private TaskStocktakingService taskStocktakingService;

    @Resource
    private TaskStocktakingItemService taskStocktakingItemService;

    @Resource
    private UserService userService;

    /**
     * 采购入库
     * @return
     */
    @PostMapping ("/purchaseInventory")
    @ApiOperation(value = "采购入库")
    public TableDataInfo purchaseInventory(@RequestBody PDADepotHeadDTO pdaDepotHeadDTO) {
        pdaDepotHeadDTO.setSubType("采购订单");
        startPage();
        List<PDADepotHeadVO> pdaDepotHeadVOList = depotHeadService.pdaList(pdaDepotHeadDTO);
        return getDataTable(pdaDepotHeadVOList);
    }

    @PostMapping("/saleOrder")
    @ApiOperation(value = "检货任务")
    public TableDataInfo saleOrder(@RequestBody PDADepotHeadDTO pdaDepotHeadDTO) {
        pdaDepotHeadDTO.setSubType("销售订单");
        startPage();
        List<PDADepotHeadVO> pdaDepotHeadVOList = depotHeadService.pdaList(pdaDepotHeadDTO);
        return getDataTable(pdaDepotHeadVOList);
    }

    @ApiModelProperty(value = "订单详情")
    @GetMapping("/orderInfo/{id}")
    public AjaxResult orderInfo(@PathVariable("id") Long id){
        DepotHead depotHead = depotHeadService.getOne(new LambdaQueryWrapperX<DepotHead>().eq(DepotHead::getId, id));
        depotHead.setSupplierName(supplierService.getOne(new LambdaQueryWrapperX<Supplier>().eq(Supplier::getId, depotHead.getOrganId())).getSupplier());
        return AjaxResult.success(depotHead);
    }

    @GetMapping("/orderDetail/{id}")
    @ApiOperation("订单明细")
    public TableDataInfo orderDetail(@PathVariable("id") Long id) {
        startPage();
        List<PDADepotItemVO> list = depotItemService.pdaList(id);
        return getDataTable(list);
    }

    @ApiOperation("订单开始处理")
    @GetMapping("/orderStartHandle/{id}")
    public AjaxResult orderStartHandle(@PathVariable("id") Long id) {
        depotHeadService.update(new UpdateWrapper<DepotHead>().set("status", "4").eq("id", id));
        return AjaxResult.success();
    }

    @ApiOperation("商品详情")
    @GetMapping("/materialDetail/{id}")
    public AjaxResult materialDetail(@PathVariable("id") Long id) {
        return AjaxResult.success(depotItemService.pdaDetail(id));
    }

    @ApiOperation("商品库存详情")
    @GetMapping("/materialDepotDetail/{type}/{materialId}")
    public TableDataInfo materialDepotDetail(@PathVariable("type") String type, @PathVariable("materialId") Long materialId) {
        startPage();
        if ("out".equals(type)) {
            type = "入库";
        } else {
            type = "出库";
        }
        List<PDADepotItemVO> list = depotItemService.materialDepotDetail(type , materialId);
        return getDataTable(list);
    }

    @ApiOperation("盘点任务列表")
    @PostMapping("/taskStocktakingList")
    public TableDataInfo taskStocktakingList(@RequestBody PDATaskStocktakingDTO pdaTaskStocktakingDTO) {
        startPage();
        List<PDATaskStocktakingVO> list = taskStocktakingService.pdaList(pdaTaskStocktakingDTO.getNumber(), pdaTaskStocktakingDTO.getStatus());
        return getDataTable(list);
    }

    @ApiOperation(value = "盘点任务详情-商品列表")
    @GetMapping("/taskStocktakingItemList/{taskId}")
    public TableDataInfo taskStocktakingItemList(@PathVariable("taskId") Long taskId){
        startPage();
        List<PDATaskStocktakingItemVO> list = taskStocktakingService.pdaItemList(taskId);
        return getDataTable(list);
    }

    @ApiOperation("盘点任务详情")
    @GetMapping("/taskStocktakingDetail/{taskId}")
    public AjaxResult taskStocktakingDetail(@PathVariable("taskId") Long taskId) throws Exception{
        TaskStocktakingVO taskStocktakingVO = taskStocktakingService.pdaDetail(taskId);
        return AjaxResult.success(taskStocktakingVO);
    }

    @ApiOperation("盘点")
    @PostMapping("/stocktaking")
    public AjaxResult stocktaking(@RequestBody TaskStocktakingItem taskStocktakingItem) throws Exception{
        User currentUser = userService.getCurrentUser();
        UpdateWrapper<TaskStocktakingItem> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", taskStocktakingItem.getId())
                .set("creator", currentUser.getId())
                .set("oper_time", new Date());
        if (ObjectUtil.isNotEmpty(taskStocktakingItem.getNewInventory())) {
            updateWrapper.set("new_inventory", taskStocktakingItem.getNewInventory());
        }
        if (ObjectUtil.isNotEmpty(taskStocktakingItem.getNewPosition())) {
            updateWrapper.set("new_position", taskStocktakingItem.getNewPosition());
        }
        if (ObjectUtil.isNotEmpty(taskStocktakingItem.getDifferenceCount())) {
            updateWrapper.set("difference_count", taskStocktakingItem.getDifferenceCount());
        }
        if (ObjectUtil.isNotEmpty(taskStocktakingItem.getDifferenceReason())){
            updateWrapper.set("difference_reason", taskStocktakingItem.getDifferenceReason());
        }
        taskStocktakingItemService.update(updateWrapper);
        return AjaxResult.success();
    }

    @ApiOperation("订单-用于返回字段说明")
    @GetMapping("test")
    public AjaxResult test(PDADepotItemVO pdaDepotItemVO) {
        return AjaxResult.success();
    }

    @ApiOperation("盘点-用于字段返回说明")
    @GetMapping("taskTest")
    public AjaxResult taskTest(PDATaskStocktakingVO pdaTaskStocktakingVO){
        return AjaxResult.success();
    }

}
