<?php

declare (strict_types = 1);

namespace App\Controller;

use App\JsonRpc\OrderServiceInterface;
use App\Tools\Result;
use Hyperf\Context\Context;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface;
use Hyperf\Validation\Contract\ValidatorFactoryInterface;

/**
 * Class OrderController
 * @package App\Controller
 */
class OrderController extends AbstractController
{
    #[Inject]
    protected ValidatorFactoryInterface $validationFactory;

    /**
     * @var OrderServiceInterface
     */
    #[Inject]
    private $orderServiceClient;
    /***
     * 状态说明
     */
    
    public function getStatus()
    {
        $data['order'] = [
            1 => '已通过',
            2 => '已驳回',
            3 => '已取消',
            5 => '已过期',
            6 => '待审核',
            7 => '已完成'
        ];
        $data['order_ad'] = [
            1 => '待投放',
            2 => '已失效',
            3 => '已失效',
            5 => '待审核',
            6 => '待审核',
            7 => '已失效',
            8 => '投放中'
        ];
        $data['check'] = [
            1 => '已通过',
            2 => '已驳回',
            6 => '待审核',
           
        ];        
        return Result::success($data);
    }
    /**
     * 获取广告尺寸及查询广告位
     */
    public function getAD()
    {
        $requireData = $this->request->all();
        if(!empty($requireData)){
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'ad_size_id' => 'required',
                    'starttime' => 'required',
                    'endtime' => 'required',
                    'pageSize' => 'required',
                    'page' => 'required',
    
                ],
                [
                    'ad_size_id.required' => '广告尺寸id不能为空',
                    'starttime.required' => '广告开始时间不能为空',
                    'endtime.required' => '广告结束时间不能为空',
                    'pageSize.required' => '显示条数不能为空',
                    'page.required' => '分页不能为空',
    
                ]
            );
            if ($validator->fails()) {
                $errorMessage = $validator->errors()->first();
                return Result::error($errorMessage);
            }
        }
        
        
        $result = $this->orderServiceClient->getAD($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }

    /**
     * 根据网站查找广告位
     */
    public function getWebsiteAd()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'ad_size_id' => 'required',
                'starttime' => 'required',
                'endtime' => 'required',
                'pageSize' => 'required',
                'page' => 'required',
            ],
            [
                'ad_size_id.required' => '广告尺寸id不能为空',
                'starttime.required' => '广告开始时间不能为空',
                'endtime.required' => '广告结束时间不能为空',
                'pageSize.required' => '显示条数不能为空',
                'page.required' => '分页不能为空'
            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->orderServiceClient->getWebsiteAd($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    public function getOrderListAdmin()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'pageSize' => 'required',
                'page' => 'required',

            ],
            [
                'pageSize.required' => '显示条数不能为空',
                'page.required' => '分页不能为空',

            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->orderServiceClient->getOrderListAdmin($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }

     /**
     * 获取广告订单价格
     */
    public function getPrice(){
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
        $requireData,
            [
                'starttime' => 'required',
                'endtime' => 'required',
            ],
            [
                'starttime.required' => '广告开始时间不能为空',
                'endtime.required' => '广告结束时间不能为空',
            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        // var_dump($requireData);
        $result = $this->orderServiceClient->getPrice($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    
    /**
     * 添加订单
     */
    public function addAD()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [

                'name' => 'required',
                'ad_size_id' => 'required',
                'starttime' => 'required',
                'endtime' => 'required',
                'imgurl' => 'required',
                'imgsrc' => 'required',
                'pid' => 'required',
                'price' =>'required'
            ],
            [
                'name.required' => '广告名称不能为空',
                'ad_size_id.required' => '广告图片尺寸id不能为空',
                'starttime.required' => '广告开始时间不能为空',
                'endtime.required' => '广告结束时间不能为空',
                'imgurl.required' => '图片广告链接不能为空',
                'imgsrc.required' => '图片广告地址不能为空',
                'pid.required' => '广告位id不能为空',
                'price.required' => '价格不能为空'
            ]
        );

        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $requireData['user_id'] = Context::get("UserId");
        $result = $this->orderServiceClient->addAD($requireData);
        // return $requireData;
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    /**
     * 获取订单列表
     */
    public function getOrderList()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'pageSize' => 'required',
                'page' => 'required',
            ],
            [
                'pageSize.required' => '显示条数不能为空',
                'page.required' => '分页不能为空',

            ]
        );
        if (isset($requireData['status'])) {
            $validator = $this->validationFactory->make(
                $requireData,
                [
                    'status' => 'required',
                ],
                [
                    'status.required' => '状态不能为空',
                ]
            );
        }
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $requireData['user_id'] = Context::get("UserId");
        $result = $this->orderServiceClient->getOrderList($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    /**
     * 获取订单详情
     */
    public function getOrderDetail()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'order_id' => 'required',
                'pageSize' => 'required',
                'page' => 'required',
            ],
            [
                'name.required' => '订单id不能为空',
                'pageSize.required' => '显示条数不能为空',
                'page.required' => '分页不能为空',

            ]
        );

        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $requireData['user_id'] = Context::get("UserId");
        $result = $this->orderServiceClient->getOrderDetail($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    /***
     * 撤回订单
     */
    public function cancelOrder()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'order_id' => 'required',
            ],
            [
                'name.required' => '订单id不能为空',
            ]
        );

        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }

        $requireData['user_id'] = Context::get("UserId");
        $result = $this->orderServiceClient->cancelOrder($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);

    }
    // 获取订单详情
    public function getOrderDetailAdmin()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',
            ],
            [
                'id.required' => '订单id不能为空',
            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }

        $result = $this->orderServiceClient->getOrderDetailAdmin($requireData);

        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    /**
     * 删除订单
     */
    public function delOrderAdmin()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [

                'id' => 'required',

            ],
            [
                'id.required' => '订单id不能为空',

            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }

        $result = $this->orderServiceClient->delOrderAdmin($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    //审核订单状态
    public function applyOrderStatusAdmin()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',
            ],
            [
                'id.required' => 'id不能为空',
            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->orderServiceClient->applyOrderStatusAdmin($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    //修改订单价格
    public function editPriceOrderAdmin()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',
                'price' => 'required|decimal:2',

            ],
            [
                'id.required' => 'id不能为空',
                'price.required' => '价格不能为空',
                'price.decimal' => '价格格式不正确',

            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->orderServiceClient->editPriceOrderAdmin($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    public function rejectOrderAdmin()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',
                'reason' => 'required',
            ],
            [
                'id.required' => 'id不能为空',
                'reason.required' => '原因不能为空',

            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->orderServiceClient->rejectOrderAdmin($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);

    }
    public function endOrderAdmin()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',

            ],
            [
                'id.required' => 'id不能为空',

            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->orderServiceClient->endOrderAdmin($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
    /**
     * 用户删除自己已失效的订单
     */
    public function delOrderAD()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',

            ],
            [
                'id.required' => '订单id不能为空',

            ]
        );
        if ($validator->fails()) {
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->orderServiceClient->delOrderAD($requireData);
        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
    }
}