<?php

namespace Status\Status\Http\Controllers;

use Exception;
use Litepie\Http\Controllers\ResourceController as BaseController;
use Litepie\Database\RequestScope;
use Status\Status\Forms\Status as StatusForm;
use Status\Status\Http\Requests\StatusRequest;
use Status\Status\Http\Resources\StatusResource;
use Status\Status\Http\Resources\StatusesCollection;
use Status\Status\Models\Status;
use Status\Status\Scopes\StatusResourceScope;


/**
 * Resource controller class for status.
 */
class StatusResourceController extends BaseController
{

    /**
     * Initialize status resource controller.
     *
     *
     * @return null
     */
    public function __construct()
    {
        parent::__construct();
        $this->form = StatusForm::grouped(false)
                        ->setAttributes()
                        ->toArray();
        $this->modules = $this->modules(config('status.status.modules'), 'status', guard_url('status'));
    }

    /**
     * Display a list of status.
     *
     * @return Response
     */
    public function index(StatusRequest $request)
    {

        $pageLimit = $request->input('pageLimit', config('database.pagination.limit'));
        $page = Status::pushScope(new RequestScope())
            ->pushScope(new StatusResourceScope())
            ->simplePaginate($pageLimit);

        $data = new StatusesCollection($page);

        $form = $this->form;
        $modules = $this->modules;

        return $this->response->setMetaTitle(trans('status::status.names'))
            ->view('status::status.index')
            ->data(compact('data', 'modules', 'form'))
            ->output();

    }

    /**
     * Display status.
     *
     * @param Request $request
     * @param Model   $status
     *
     * @return Response
     */
    public function show(StatusRequest $request, Status $model)
    {
        $form = $this->form;
        $modules = $this->modules;
        $data = new StatusResource($model);

        return $this->response
            ->setMetaTitle(trans('app.view') . ' ' . trans('status::status.name'))
            ->data(compact('data', 'form', 'modules'))
            ->view('status::status.show')
            ->output();

    }

    /**
     * Show the form for creating a new status.
     *
     * @param Request $request
     *
     * @return Response
     */
    public function create(StatusRequest $request, Status $model)
    {
        $form = $this->form;
        $modules = $this->modules;
        $data = new StatusResource($model);
        return $this->response->setMetaTitle(trans('app.new') . ' ' . trans('status::status.name'))
            ->view('status::status.create')
            ->data(compact('data', 'form', 'modules'))
            ->output();

    }

    /**
     * Create new status.
     *
     * @param Request $request
     *
     * @return Response
     */
    public function store(StatusRequest $request, Status $model)
    {
        try {
            $attributes = $request->all();
            $attributes['user_id'] = user_id();
            $attributes['user_type'] = user_type();
            $model = $model->create($attributes);
            $data = new StatusResource($model);

            return $this->response->message(trans('messages.success.created', ['Module' => trans('status::status.name')]))
                ->code(204)
                ->data(compact('data'))
                ->status('success')
                ->url(guard_url('status/status/' . $model->getRouteKey()))
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url(guard_url('/status/status'))
                ->redirect();
        }

    }

    /**
     * Show status for editing.
     *
     * @param Request $request
     * @param Model   $status
     *
     * @return Response
     */
    public function edit(StatusRequest $request, Status $model)
    {
        $form = $this->form;
        $modules = $this->modules;
        $data = new StatusResource($model);

        return $this->response->setMetaTitle(trans('app.edit') . ' ' . trans('status::status.name'))
            ->view('status::status.edit')
            ->data(compact('data', 'form', 'modules'))
            ->output();

    }

    /**
     * Update the status.
     *
     * @param Request $request
     * @param Model   $status
     *
     * @return Response
     */
    public function update(StatusRequest $request, Status $model)
    {
        try {
            $attributes = $request->all();
            $model = $model->update($attributes);
            $data = new StatusResource($model);

            return $this->response->message(trans('messages.success.updated', ['Module' => trans('status::status.name')]))
                ->code(204)
                ->status('success')
                ->data(compact('data'))
                ->url(guard_url('status/status/' . $model->getRouteKey()))
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url(guard_url('status/status/' .  $model->getRouteKey()))
                ->redirect();
        }

    }

    /**
     * Remove the status.
     *
     * @param Model   $status
     *
     * @return Response
     */
    public function destroy(StatusRequest $request, Status $model)
    {
        try {
            $model->delete();
            $data = new StatusResource($model);

            return $this->response->message(trans('messages.success.deleted', ['Module' => trans('status::status.name')]))
                ->code(202)
                ->status('success')
                ->data(compact('data'))
                ->url(guard_url('status/status/0'))
                ->redirect();

        } catch (Exception $e) {

            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url(guard_url('status/status/' .  $model->getRouteKey()))
                ->redirect();
        }

    }
}