<?php

namespace Bixo\CrossTrade\Http\Controllers;

use Exception;
use Bixo\CrossTrade\Actions\OfferUsVehicleWorkflow;
use Bixo\CrossTrade\Http\Requests\OfferUsVehicleWorkflowRequest;
use Bixo\CrossTrade\Http\Resources\OfferUsVehicleResource;
use Bixo\CrossTrade\Models\OfferUsVehicle;
use Litepie\Http\Controllers\ActionController as BaseController;

/**
 * Workflow controller class.
 *
 */
class OfferUsVehicleWorkflowController extends BaseController
{
    /**
     * Action controller function for offer_us_vehicle.
     *
     * @param Model $offer_us_vehicle
     * @param action next action for the offer_us_vehicle.
     *
     * @return Response
     */
    public function __invoke(OfferUsVehicleWorkflowRequest $request, OfferUsVehicle $offer_us_vehicle, $trasition)
    {
        try {
            $request = $request->all();
            $offer_us_vehicle = OfferUsVehicleWorkflow::run($trasition, $offer_us_vehicle, $request);
            $data = new OfferUsVehicleResource($offer_us_vehicle);
            return $this->response->message(trans('messages.success.updated', ['Module' => trans('cross_trade::offer_us_vehicle.name')]))
                ->code(204)
                ->data(compact('data'))
                ->status('success')
                ->url(guard_url('cross_trade/offer_us_vehicle/' . $offer_us_vehicle->getRouteKey()))
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url(guard_url('cross_trade/offer_us_vehicle/' . $offer_us_vehicle->getRouteKey()))
                ->redirect();
        }
    }


    /**
     * Get the offer_us_vehicle and user for the workflow.
     *
     * @param PublicRequest $request
     * @param string $offer_us_vehicle
     * @param string $user
     *
     * @return Response
     */
    public function get(PublicRequest $request, $offer_us_vehicle, $user)
    {
        if (!$request->hasValidSignature()) {
            abort(403, 'This url is expired!');
        }

        $auth = Auth::guard()->getProvider()->getModel();
        $user = $auth::findBySignedId($user);
        Auth::guard()->login($user);
        $offer_us_vehicle = OfferUsVehicle::findBySignedId($offer_us_vehicle);
        $transitions = $this->transitions($offer_us_vehicle, $user);
        $user = user();
        Auth::logout();
        return $this->response->setMetaTitle(trans('cross_trade::offer_us_vehicle.name') . ' ' . trans('Approvals'))
            ->view('cross_trade::public.offer_us_vehicle.workflow')
            ->layout('mobile')
            ->data(compact('offer_us_vehicle', 'user', 'transitions'))
            ->output();
    }

    /**
     * Display the workflow form for the offer_us_vehicle.
     *
     * @param PublicRequest $request
     * @param string $offer_us_vehicle
     * @param string $user
     *
     * @return Response
     */
    public function post(PublicRequest $request, $offer_us_vehicle, $user)
    {
        if (!$request->hasValidSignature()) {
            abort(403, 'This url is expired!');
        }
        $transition = $request->transition;
        $auth = Auth::guard()->getProvider()->getModel();
        $user = $auth::findBySignedId($user);
        Auth::guard()->login($user);
        $offer_us_vehicle = OfferUsVehicle::findBySignedId($offer_us_vehicle);
        $user = user();
        $offer_us_vehicle = OfferUsVehicleWorkflow::run($transition, $offer_us_vehicle, $request->all());
        Auth::logout();

        return response()->json(
            [
                'status' => 'success',
                'url' => $request->url(),
            ]
        );
    }

    private function transitions($offer_us_vehicle, $user)
    {
        $transitions = [];
        foreach ($offer_us_vehicle->workflow()->transitions($offer_us_vehicle) as $key => $value) {
            $name = $value->getName();
            $array['url'] = URL::temporarySignedRoute('litecms.offer_us_vehicle.workflow', now()->addMinutes(3), [
                'guard' => 'admin',
                'transition' => $name,
                'offer_us_vehicle' => $offer_us_vehicle->getSignedId(now()->addMinutes(3)),
                'user' => $user->getSignedId(now()->addMinutes(3)),
                'trans' => 'en',
            ]
            );
            $array['name'] = $name;
            $array['key'] = $name;
            $array['form'] = $offer_us_vehicle->workflow()->form($value);
            $array['label'] = trans('cross_trade::offer_us_vehicle.workflow.' . $name);
            $transitions[] = $array;
        }
        return $transitions;
    }
}