<?php

namespace Litecms\LeadershipBonus\Http\Controllers;

use App\Http\Controllers\ResourceController as BaseController;
use Form;
use Litecms\LeadershipBonus\Http\Requests\LeadershipBonusRequest;
use Litecms\LeadershipBonus\Interfaces\LeadershipBonusRepositoryInterface;
use Litecms\LeadershipBonus\Models\LeadershipBonus;

/**
 * Resource controller class for leadership_bonus.
 */
class LeadershipBonusResourceController extends BaseController
{

    /**
     * Initialize leadership_bonus resource controller.
     *
     * @param type LeadershipBonusRepositoryInterface $leadership_bonus
     *
     * @return null
     */
    public function __construct(LeadershipBonusRepositoryInterface $leadership_bonus)
    {
        parent::__construct();
        $this->repository = $leadership_bonus;
        $this->repository
            ->pushCriteria(\Litepie\Repository\Criteria\RequestCriteria::class)
            ->pushCriteria(\Litecms\LeadershipBonus\Repositories\Criteria\LeadershipBonusResourceCriteria::class);
    }

    /**
     * Display a list of leadership_bonus.
     *
     * @return Response
     */
    public function index(LeadershipBonusRequest $request)
    {
        $view = $this->response->theme->listView();

        if ($this->response->typeIs('json')) {
            $function = camel_case('get-' . $view);
            return $this->repository
                ->setPresenter(\Litecms\LeadershipBonus\Repositories\Presenter\LeadershipBonusPresenter::class)
                ->$function();
        }

        $leadership_bonuses = $this->repository->paginate();

        return $this->response->title(trans('leadership_bonus::leadership_bonus.names'))
            ->view('leadership_bonus::leadership_bonus.index', true)
            ->data(compact('leadership_bonuses'))
            ->output();
    }

    /**
     * Display leadership_bonus.
     *
     * @param Request $request
     * @param Model   $leadership_bonus
     *
     * @return Response
     */
    public function show(LeadershipBonusRequest $request, LeadershipBonus $leadership_bonus)
    {

        if ($leadership_bonus->exists) {
            $view = 'leadership_bonus::leadership_bonus.show';
        } else {
            $view = 'leadership_bonus::leadership_bonus.new';
        }

        return $this->response->title(trans('app.view') . ' ' . trans('leadership_bonus::leadership_bonus.name'))
            ->data(compact('leadership_bonus'))
            ->view($view, true)
            ->output();
    }

    /**
     * Show the form for creating a new leadership_bonus.
     *
     * @param Request $request
     *
     * @return Response
     */
    public function create(LeadershipBonusRequest $request)
    {

        $leadership_bonus = $this->repository->newInstance([]);
        return $this->response->title(trans('app.new') . ' ' . trans('leadership_bonus::leadership_bonus.name')) 
            ->view('leadership_bonus::leadership_bonus.create', true) 
            ->data(compact('leadership_bonus'))
            ->output();
    }

    /**
     * Create new leadership_bonus.
     *
     * @param Request $request
     *
     * @return Response
     */
    public function store(LeadershipBonusRequest $request)
    {
        try {
            $attributes              = $request->all();
            $attributes['user_id']   = user_id();
            $attributes['user_type'] = user_type();
            $leadership_bonus                 = $this->repository->create($attributes);

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

    }

    /**
     * Show leadership_bonus for editing.
     *
     * @param Request $request
     * @param Model   $leadership_bonus
     *
     * @return Response
     */
    public function edit(LeadershipBonusRequest $request, LeadershipBonus $leadership_bonus)
    {
        return $this->response->title(trans('app.edit') . ' ' . trans('leadership_bonus::leadership_bonus.name'))
            ->view('leadership_bonus::leadership_bonus.edit', true)
            ->data(compact('leadership_bonus'))
            ->output();
    }

    /**
     * Update the leadership_bonus.
     *
     * @param Request $request
     * @param Model   $leadership_bonus
     *
     * @return Response
     */
    public function update(LeadershipBonusRequest $request, LeadershipBonus $leadership_bonus)
    {
        try {
            $attributes = $request->all();

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

    }

    /**
     * Remove the leadership_bonus.
     *
     * @param Model   $leadership_bonus
     *
     * @return Response
     */
    public function destroy(LeadershipBonusRequest $request, LeadershipBonus $leadership_bonus)
    {
        try {

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

        } catch (Exception $e) {

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

    }

    /**
     * Remove multiple leadership_bonus.
     *
     * @param Model   $leadership_bonus
     *
     * @return Response
     */
    public function delete(LeadershipBonusRequest $request, $type)
    {
        try {
            $ids = hashids_decode($request->input('ids'));

            if ($type == 'purge') {
                $this->repository->purge($ids);
            } else {
                $this->repository->delete($ids);
            }

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

        } catch (Exception $e) {

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

    }

    /**
     * Restore deleted leadership_bonuses.
     *
     * @param Model   $leadership_bonus
     *
     * @return Response
     */
    public function restore(LeadershipBonusRequest $request)
    {
        try {
            $ids = hashids_decode($request->input('ids'));
            $this->repository->restore($ids);

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

        } catch (Exception $e) {

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

    }

}