<?php

namespace App\Http\Controllers\Api\v1;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\Order\OrderFuturesCancelRequest;
use App\Http\Requests\Api\Order\OrderFuturesStoreRequest;
use App\Http\Requests\Api\Order\OrderStoreRequest;
use App\Http\Resources\Order\OpenFuturesOrderCollection;
use App\Interfaces\Order\OrderRepositoryInterface;
use Dedoc\Scramble\Attributes\ExcludeRouteFromDocs;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class FuturesController extends Controller
{
    /**
     * @var OrderRepository
     */
    private $orderRepository;

    /**
     * OrdersController constructor.
     * @param OrderRepositoryInterface $orderRepository
     */
    public function __construct(OrderRepositoryInterface $orderRepository)
    {
        $this->middleware(['auth:sanctum','maintenance'])->only(['store']);

        $this->orderRepository = $orderRepository;
    }


    public function store(OrderFuturesStoreRequest $request)
    {
        if(!$request->user()->tokenCan('trade')) {
            return response()->json(['message' => 'Unauthorized'], STATUS_FORBIDDEN);
        }

        try {
            return response()->json(['message' => $this->orderRepository->store(true)]);
        } catch (\Exception $e) {
            Log::error($e);
            exit();
        }
    }

    #[ExcludeRouteFromDocs]
    /**
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return response()->json(null, STATUS_NOT_FOUND);
    }

    #[ExcludeRouteFromDocs]
    /**
     * @return \Illuminate\Http\Response
     */
    public function show()
    {
        return response()->json(null, STATUS_NOT_FOUND);
    }

    #[ExcludeRouteFromDocs]
    /**
     * @return \Illuminate\Http\Response
     */
    public function edit()
    {
        return response()->json(null, STATUS_NOT_FOUND);
    }

    #[ExcludeRouteFromDocs]
    /**
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return response()->json(null, STATUS_NOT_FOUND);
    }

    public function open(Request $request)
    {
        $market = request()->get('market', null);

        return new OpenFuturesOrderCollection($this->orderRepository->openFutures($market));
    }


    public function cancel(OrderFuturesCancelRequest $request)
    {
        if(!$request->user()->tokenCan('trade')) {
            return response()->json(['message' => 'Unauthorized'], STATUS_FORBIDDEN);
        }

        $status = $this->orderRepository->cancelFutures();

        return response()->json(['message' => $status ? 'request processed' : 'request_was_not_processed']);
    }
}
