<?php


namespace App\Http\Controllers\api\thirdPart\haiq;


use App\Http\Requests\ForeignHaiRobotic_taskUpdateRequest;
use App\MaterialBox;
use App\Services\ForeignHaiRoboticsService;
use App\Services\LogService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Ramsey\Uuid\Uuid;

class StorageController
{
    protected $post;

    /** @var ForeignHaiRoboticsService $service */
    private $service;
    public function __construct()
    {
        $this->service=app('ForeignHaiRoboticsService');
        $stockInfo = [
            "skuCode" => "TEST-BSSKU",//商品编码 sku
            "qty" => 9,//数量
        ];
        $bin = [
            "taskCode" => "TEST-BS2010100001",//任务编号 全局唯一
            "binCode" => "TEST-BIN01",//料箱编码
            "fromLocCode" => "HAIB1-02-01",//源库位编码
            "toLocCode" => "HAIB1-02-01",//目标库位编码 出库填多个，表示这些库位都可以支持
            "sequence" => -1,//出库顺序 -1表示没有顺序，只有移库出库时需要指定顺序，其他可为-1
            "stockInfo" => [$stockInfo],//商品信息
        ];
        /*$this->request = [[
            "groupCode" => 1,//组号/波次号 一组任务需要一起完成，再开始下一组任务；没有组任务的限制默认传-1或空
            "taskMode" => 3,//任务模式 值 1 (输送线入库)值 2 (输送线出库)值 3（货架到缓存货架）值4（货架到流利货架）
            "priority" => 99,//优先级 1-2147483647 1最低
            "sequenceFlag" => -1,//是否需要有序 1：需要有序 0：不需要有序
            "bins" => [$bin],//可执行货箱任务
        ]];*///IDE0005714,IDE0004970,IDE0005676,IDE0005665
        $this->post = [[
            "taskMode"      => 1,
            "bins"=>[
                [
                    "binCode"   => "IDE0005713",
                    "taskCode"  =>UUID::uuid4().'|'.microtime(true),
                    "fromLocCode" => "BIN-IN1",
                "toLocCode" => "",
            ],
                ],
            "groupCode"     => 'g'.microtime(true),
            "priority"      => 20,
            "sequenceFlag"  => 1,
        ]];
        $this->post2 = [[
            "taskMode"      => 2,
            "bins"=>[

                [
                "taskCode"  =>Uuid::uuid4().'|'.microtime(true),
                "binCode"   => "IDE0005132",
                "fromLocCode" => "",
                "toLocCode" => "BIN-OUT1",
            ],
                [
                "taskCode"  =>Uuid::uuid4().'|'.microtime(true),
                "binCode"   => "IDE0005152",
                "fromLocCode" => "",
                "toLocCode" => "BIN-OUT1",
            ],
                [
                "taskCode"  =>Uuid::uuid4().'|'.microtime(true),
                "binCode"   => "IDE0000159",
                "fromLocCode" => "",
                "toLocCode" => "BIN-OUT1",
            ],
                [
                "taskCode"  =>Uuid::uuid4().'|'.microtime(true),
                "binCode"   => "IDE0004951",
                "fromLocCode" => "",
                "toLocCode" => "BIN-OUT1",
            ],
                ],
            "groupCode"     => 'g'.microtime(true),
            "priority"      => 20,
            "sequenceFlag"  => 1,
        ]];
        $this->moveBinIn = [[
            "taskMode"      => 6,
            "bins"=>[[
                "taskCode"  =>'t1'.microtime(true),
                "binCode"   => "IDE0005173",
                "fromLocCode" => "HAIB1-02-03", //B1是面对架货右手，从右往左数列，第三个数字从下往上数行
                "toLocCode" => "",
            ]
//                ,[
//                "taskCode"  =>'t2'.microtime(true),
//                "binCode"   => "IDE0004973",
//                "fromLocCode" =>  "HAIB1-02-03", //B1是面对架货右手，从右往左数列，第三个数字从下往上数行
//                "toLocCode" => "",
//            ]
//                ,[
//                "taskCode"  =>'t3'.microtime(true),
//                "binCode"   => "IDE0005716",
//                "fromLocCode" =>  "HAIB1-03-02", //B1是面对架货右手，从右往左数列，第三个数字从下往上数行
//                "toLocCode" => "",
//            ],
                ],
            "groupCode"     => 'g'.microtime(true),
            "priority"      => 20,
            "sequenceFlag"  => 1,
        ]];
        $this->moveBinIn2 = [[
            "taskMode"      => 3,
            "bins"=>[
                [
                "taskCode"  =>'t1'.microtime(true),
                "binCode"   => "IDE0005716",
                "fromLocCode" => "", //B1是面对架货右手，从右往左数列，第三个数字从下往上数行
                "toLocCode" => "HAIB1-02-03",
            ],
//                [
//                "taskCode"  =>'t2'.microtime(true),
//                "binCode"   => "IDE0004973",
//                "fromLocCode" =>  "", //B1是面对架货右手，从右往左数列，第三个数字从下往上数行
//                "toLocCode" => "HAIB1-02-03",
//            ],[
//                "taskCode"  =>'t3'.microtime(true),
//                "binCode"   => "IDE0005716",
//                "fromLocCode" =>  "", //B1是面对架货右手，从右往左数列，第三个数字从下往上数行
//                "toLocCode" => "HAIB1-03-02",
//            ],
                ],
            "groupCode"     => 'g'.microtime(true),
            "priority"      => 20,
            "sequenceFlag"  => 1,
        ]];
        $this->move = [[
            "taskMode"      => 3,
            "bins"=>[[
                "taskCode"  =>'t'.Uuid::uuid4(),
                "binCode"   => "IDE0005678",
                "fromLocCode" => "",
                "toLocCode" => "HAIB1-03-01",
            ],[
                "taskCode"  =>'t'.Uuid::uuid4(),
                "binCode"   => "IDE0004975",
                "fromLocCode" => "",
                "toLocCode" => "HAIB1-03-02",
            ],],
            "groupCode"     => 'g'.microtime(true),
            "priority"      => 20,
            "sequenceFlag"  => 1,
        ]];//128,129.127
        $this->move2 = [[
            "taskMode"      => 6,
            "bins"=>[
                [
                "taskCode"  =>'t'.Uuid::uuid4(),
                "binCode"   => "IDE0005711",
                "fromLocCode" => "HAIB1-01-02", //B1是面对架货右手，从右往左数列，第三个数字从下往上数行
                "toLocCode" => "",
            ],
                [
                "taskCode"  =>'t'.Uuid::uuid4(),
                "binCode"   => "IDE0005680",
                "fromLocCode" => "HAIB1-02-02", //B1是面对架货右手，从右往左数列，第三个数字从下往上数行
                "toLocCode" => "",
            ],
                ],
            "groupCode"     => 'g'.microtime(true),
            "priority"      => 20,
            "sequenceFlag"  => 1,
        ]];
        $this->move3 = [[
            "taskMode"      => 6,
            "bins"=>[[
                "taskCode"  =>"testm11",
                "binCode"   => "IDE0000128",
                "fromLocCode" => "HAIB2-01-01",
                "toLocCode" => "",
            ],[
                "taskCode"  =>"testm21",
                "binCode"   => "IDE000129",
                "fromLocCode" => "HAIB2-02-01",
                "toLocCode" => "",
            ],[
                "taskCode"  =>"testm31",
                "binCode"   => "IDE0000127",
                "fromLocCode" => "HAIB2-03-01",
                "toLocCode" => "",
            ],],
            "groupCode"     => 'WMm2',
            "priority"      => 20,
            "sequenceFlag"  => 1,
        ]];
        $this->lightOn = [
            "areaCode"=> "1004",
            "PTLAction"=> 1, //1是开，0是关
            "PTLSettings"=> [
                "color"=> 1,
                "frequency"=> 1
            ],
            "displayInfo"=> [
                "detail01"=> "detail01",
                "detail02"=> "detail02",
                "detail03"=> "detail03",
                "qrCode"=> "qrCode",
                "qty00"=> "11",
                "qty01"=> 1,
                "qty02"=> 2,
                "title"=> "title",
                "uomDesc01"=> "uo",
                "uomDesc02"=> "uo"
            ],
            "locCode"=> "HAIB2-02-03"//灯条口，B1\B2=设备编号，中间号码代表从右往左数的列，右边号码时从下往上数
        ];
        $this->lightOff = [
            "PTLAction"=> 0,
            "locCode"=> "HAIB2-02-03"
        ];
    }

    public function relocate(Request $request,$post){
        $response = Http::post(config('api.haiq.storage.moveBin'),$post);
        if (!$response->ok()){
            app('LogService')->log(__METHOD__,"haiq-请求失败,路径异常","REQUEST：".json_encode($this->post)." | RESPONSE：".$response);
            return ['success'=>false,"data"=>$response->body()];
        }
        if (($response["code"] ?? false) && $response["code"] != 200){
            app('LogService')->log(__METHOD__,"haiq-料箱出库失败","REQUEST：".json_encode($this->post)." | RESPONSE：".$response);
            return ['success'=>false,"data"=>$response["errMsg"]];
        }
       if (($response["status"] ?? false) && $response["status"] == 500){
           app('LogService')->log(__METHOD__,"haiq-料箱出库失败","REQUEST：".json_encode($this->post)." | RESPONSE：".$response);
           return ['success'=>false,"data"=>$response["msg"]];
        }
        app('LogService')->log(__METHOD__,"haiq-料箱出库成功","REQUEST：".json_encode($this->post)." | RESPONSE：".$response);
        return ["success"=>true,'data'=>$response->body()];
    }
    public function light(Request $request,$post){
        $response = Http::post(config('api.haiq.storage.light'),$post);
        return $response->body();
    }
    public function moveBinOut(Request $request){
        return $this->relocate($request,$this->post);
    }
    public function postBin1(Request $request){
        return $this->relocate($request,$this->post);
    }
    public function postBin2(Request $request){
        return $this->relocate($request,$this->post2);
    }
    public function moveBinIn(Request $request){
        return $this->relocate($request,$this->moveBinIn);
    }
    public function moveBinIn2(Request $request){
        return $this->relocate($request,$this->moveBinIn2);
    }

    public function moveBinM(Request $request){
        return $this->relocate($request,$this->move);
    }
    public function moveBinM2(Request $request){
        return $this->relocate($request,$this->move2);
    }
    public function lightOn(Request $request){
        return $this->light($request,$this->lightOn);
    }
    public function lightOff(Request $request){
        return $this->light($request,$this->lightOff);
    }
    public function taskUpdate(ForeignHaiRobotic_taskUpdateRequest $request){
        LogService::log('海柔请求','taskUpdate',
            json_encode($request->all()));
        try{
            $stationTaskMaterialBox_id = explode('_',$request['taskCode'])[0];
            $this->service->taskUpdate(
//                $request['groupCode']
                $stationTaskMaterialBox_id
                ,$request['updateEventType']
                ,$request['status']
                ,$request['binCode']
//                ,$request['kubotId']
//                ,$request['description']
            );
            return ['code'=>200,'errMsg'=>'','data'=>$request->all()];
        }catch (\Exception $e){
            return ['code'=>$e->getCode(),'errMsg'=>$e->getMessage(),'data'=>$request->all()];
        }
    }
    public function exception(Request $request){
        $this->service->excepted('海柔异常','',json_encode($request));
        return ['code'=>200,'errMsg'=>'','data'=>$request->all()];
    }
    public function takeOutToULine(Request $request){
        $codesTxt=$request->input('codes');
        $codes=preg_split('/[\s,.，。]/',$codesTxt);
        if(!$codes||count($codes)==0)return ['result'=>'请输入料箱号'];
        $post = [
            [
            "taskMode"      => 2,
            "bins"=>[
            ],
            "groupCode"     => 'g'.microtime(true),
            "priority"      => 20,
            "sequenceFlag"  => 1,
        ]
        ];
        foreach ($codes as &$code){
            if(!trim($code))continue;
            $code=str_replace(['ide','IDE'],'',$code);
            $code='IDE'.str_pad($code,7,'0',STR_PAD_LEFT);
            $post[0]['bins'][]=[
                "taskCode"  =>Uuid::uuid4().'|'.microtime(true),
                "binCode"   => $code,
                "fromLocCode" => "",
                "toLocCode" => "BIN-OUT1",
            ];
        }
        $response = Http::post(config('api.haiq.storage.moveBin'),$post);
        $responseBody = $response->body();
        LogService::log(__CLASS__,__METHOD__,$responseBody);
        $responseBody = strstr($responseBody,'200')?'请求出库料箱"'.implode(',',$codes).'"成功':$responseBody;
        if(strstr($responseBody,'成功')){
            MaterialBox::query()->whereIn('code',$codes)->update(['status'=>'在出库中']);
        }
        return ['result'=> $responseBody];
    }
}
