<?php

namespace App\Http\Controllers\Api\v1;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\Order\OrderCancelRequest;
use App\Http\Requests\Api\Order\OrderStoreRequest;
use App\Http\Resources\Market\MarketLiteCollection;
use App\Http\Resources\Order\OrderCollection;
use App\Http\Resources\Order\OrderHistory;
use App\Http\Resources\Transaction\Trades\Trade;
use App\Interfaces\Order\OrderRepositoryInterface;
use App\Repositories\Market\MarketRepository;
use App\Repositories\Order\OrderHistoryRepository;
use App\Repositories\Transaction\TransactionRepository;
use Dedoc\Scramble\Attributes\ExcludeRouteFromDocs;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Inertia\Inertia;

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

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

        $this->orderRepository = $orderRepository;
    }


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

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


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

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

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


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

        return new OrderCollection($this->orderRepository->open($market));
    }

    #[ExcludeRouteFromDocs]
    public function index()
    {
        return response()->json(null, STATUS_NOT_FOUND);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  string  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        return response()->json(null, STATUS_NOT_FOUND);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        return response()->json(null, STATUS_NOT_FOUND);
    }

    #[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);
    }

    public function orderHistory() {

        $orderHistoryRepository = new OrderHistoryRepository();

        $orders = OrderHistory::collection($orderHistoryRepository->getReportUser(auth()->user(), false))->response()->getData(true);

        return response()->json($orders);
    }

    public function tradeHistory() {

        $transactionRepository = new TransactionRepository();

        $transactions = Trade::collection($transactionRepository->getReportUser(auth()->user(), false))->response()->getData(true);

        return response()->json($transactions);
    }
}
