/*
 *  Copyright 2019-2020 Zheng Jie
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.youchain.businessdata.rest;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.youchain.annotation.AnonymousAccess;
import com.youchain.annotation.Log;
import com.youchain.basicdata.domain.Box;
import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.service.ItemService;
import com.youchain.businessdata.ReturnJson.RPTaskList;
import com.youchain.businessdata.domain.Inventory;
import com.youchain.businessdata.domain.PickDetail;
import com.youchain.businessdata.domain.Task;
import com.youchain.businessdata.inputJson.IPPickDetail;
import com.youchain.businessdata.inputJson.IScanPut;
import com.youchain.businessdata.service.InventoryLogService;
import com.youchain.businessdata.service.PickDetailService;
import com.youchain.businessdata.service.TaskService;
import com.youchain.businessdata.service.dto.PickDetailDto;
import com.youchain.businessdata.service.dto.PickDetailQueryCriteria;
import com.youchain.businessdata.service.dto.TaskDto;
import com.youchain.businessdata.service.dto.TaskQueryCriteria;
import com.youchain.exception.handler.ApiError;
import com.youchain.exception.handler.ApiResult;
import com.youchain.utils.BizStatus;
import com.youchain.utils.HttpUtils;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.engine.spi.EntityEntryFactory;
import org.springframework.data.domain.Pageable;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;

import static org.springframework.http.HttpStatus.BAD_REQUEST;

/**
 * @author huojin
 * @website https://eladmin.vip
 * @date 2023-08-16
 **/
@RestController
@Slf4j
@RequiredArgsConstructor
@Api(tags = "pickDetail管理")
@RequestMapping("/api/pickDetail")
public class PickDetailController {

    private final PickDetailService pickDetailService;
    private final TaskService taskService;


    @Log("导出数据")
    @ApiOperation("导出数据")
    @GetMapping(value = "/download")
    @PreAuthorize("@el.check('pickDetail:list')")
    public void exportPickDetail(HttpServletResponse response, PickDetailQueryCriteria criteria) throws IOException {
        pickDetailService.download(pickDetailService.queryAll(criteria), response);
    }

    @GetMapping
    @Log("查询pickDetail")
    @ApiOperation("查询pickDetail")
    @PreAuthorize("@el.check('pickDetail:list')")
    public ResponseEntity<Object> queryPickDetail(PickDetailQueryCriteria criteria, Pageable pageable) {
        return new ResponseEntity<>(pickDetailService.queryAll(criteria, pageable), HttpStatus.OK);
    }

    @PostMapping
    @Log("新增pickDetail")
    @ApiOperation("新增pickDetail")
    @PreAuthorize("@el.check('pickDetail:add')")
    public ResponseEntity<Object> createPickDetail(@Validated @RequestBody PickDetail resources) {
        resources.setPo(new Date().getTime() + "");
        resources.setStatus(BizStatus.OPEN);
        return new ResponseEntity<>(pickDetailService.create(resources), HttpStatus.CREATED);
    }

    @PutMapping
    @Log("修改pickDetail")
    @ApiOperation("修改pickDetail")
    @PreAuthorize("@el.check('pickDetail:edit')")
    public ResponseEntity<Object> updatePickDetail(@Validated @RequestBody PickDetail resources) {
        pickDetailService.update(resources);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    @DeleteMapping
    @Log("删除pickDetail")
    @ApiOperation("删除pickDetail")
    @PreAuthorize("@el.check('pickDetail:del')")
    public ResponseEntity<Object> deletePickDetail(@RequestBody Long[] ids) {
        pickDetailService.deleteAll(ids);
        return new ResponseEntity<>(HttpStatus.OK);
    }

    @PostMapping("/allocate")
    @Log("分配")
    @ApiOperation("分配")
    @AnonymousAccess
    public synchronized ResponseEntity<Object> allocate(@RequestBody Long[] ids) throws Exception {
        List<Long> pickDetailIds = Arrays.asList(ids);
        if (pickDetailIds.size() > 0) {
            try {
                for (Long id : pickDetailIds) {
                    PickDetailDto pickDetailDto = pickDetailService.findById(id);
                    pickDetailService.allocate(id, pickDetailDto.getOrderQty());
                }
            } catch (Exception e) {
                return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), e.getMessage(), ""), HttpStatus.BAD_REQUEST);

            }
        } else {
            return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), "参数错误或者为null", ""), HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>(HttpStatus.OK);
    }

    @PostMapping("/cancelAllocate")
    @Log("取消分配")
    @ApiOperation("取消分配")
    @AnonymousAccess
    public synchronized ResponseEntity<Object> cancelAllocate(@RequestBody Long[] ids) throws Exception {
        List<Long> pickDetailIds = Arrays.asList(ids);
        if (pickDetailIds.size() > 0) {
            try {
                for (Long id : pickDetailIds) {
                    PickDetailDto pickDetailDto = pickDetailService.findById(id);
                    pickDetailService.cancelAllocate(id, pickDetailDto.getAllocatedQty());
                }

            } catch (Exception e) {
                return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), e.getMessage(), ""), HttpStatus.BAD_REQUEST);
            }
        } else {
            return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), "参数错误或者为null", ""), HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>(HttpStatus.OK);
    }

    @PostMapping("/queryTaskApp")
    @Log("查询拣货列表")
    @ApiOperation("查询拣货列表")
    @PreAuthorize("@el.check('pickDetail:queryTaskApp')")
    @AnonymousAccess
    public ResponseEntity<Object>  queryTaskApp(@RequestBody IScanPut s){
        List<RPTaskList> t=taskService.queryTaskApp(null);
        return new ResponseEntity<>(t,HttpStatus.OK);
    }

    @PostMapping("/pickingApp")
    @Log("APP拣货确认")
    @ApiOperation("APP拣货确认")
    @PreAuthorize("@el.check('pickDetail:pickingApp')")
    @AnonymousAccess
    public ResponseEntity<Object>  pickingApp(@RequestBody IPPickDetail d) throws Exception{
        return  pick_in(d.getPickDetailId());
    }

    @PostMapping("/picking")
    @Log("拣货")
    @ApiOperation("拣货确认")
    @AnonymousAccess
    public synchronized ResponseEntity<Object> picking(@RequestBody Long pickDetailId) throws Exception {
        return  pick_in(pickDetailId);
    }

    public ResponseEntity<Object> pick_in(Long pickDetailId){
        //查询未完成的拣货任务
        List<Task> Tasks = taskService.getPickNotAllTask(pickDetailId);
        if (Tasks.size() > 0) {
            try {
                for (Task task : Tasks) {
                    log.error("正在拣货-----");
                    taskService.pickConfirm(task.getId(), task.getPlanQty());
                }
            } catch (Exception e) {
                return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), e.getMessage(), ""), HttpStatus.BAD_REQUEST);
            }
        } else {
            return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), "已拣货完成，请勿重复操作！", ""), HttpStatus.BAD_REQUEST);
        }
        log.error("完成拣货-----");
        return new ResponseEntity(ApiResult.fail(HttpStatus.OK.value(), "已拣货完成，请勿重复操作！", ""), HttpStatus.OK);

    }



    @PostMapping("/pickBarBack")
    @Log("退拣")
    @ApiOperation("退拣")
    @AnonymousAccess
    public synchronized ResponseEntity<Object> pickBarBack(@RequestBody Long pickDetailId) throws Exception {
        //查询已完成的拣货任务
        List<Task> Tasks = taskService.getPickAllTask(pickDetailId);
        if (Tasks.size() > 0) {
            try {
                for (Task task : Tasks) {
                    taskService.pickBarBack(task.getId(), task.getMoveQty());
                }
            } catch (Exception e) {
                return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), e.getMessage(), ""), HttpStatus.BAD_REQUEST);
            }
        } else {
            return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), "已退拣完成，请勿重复操作！", ""), HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>(HttpStatus.OK);
    }

}
