<?php
/**
 * Created by PhpStorm.
 * User: radko
 * Date: 2018-12-13
 * Time: 10:13
 */

namespace Seka\Vzdelavanie\Http\Controllers\Api\Backend\Kniznica;

use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
use Seka\Vzdelavanie\Http\Controllers\Api\Controller;
use Seka\Vzdelavanie\Http\Requests\Api\SekciaMoveRequest;
use Seka\Vzdelavanie\Http\Resources\SekciaResource;
use Seka\Vzdelavanie\Models\Kniznica\Sekcia;
use Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException;
use Seka\Vzdelavanie\Services\SekciaServiceInterface;

/**
 * Class SekciaController
 *
 * @package Seka\Vzdelavanie\Http\Controllers\Api\Backend\Kniznica
 */
class SekciaController extends Controller
{
    /**
     * @var \Seka\Vzdelavanie\Services\SekciaServiceInterface
     */
    private $sekciaService;

    /**
     * SekciaController constructor.
     *
     * @param \Seka\Vzdelavanie\Services\SekciaServiceInterface $sekciaService
     */
    public function __construct(SekciaServiceInterface $sekciaService)
    {
        $this->sekciaService = $sekciaService;
    }

    /**
     * @param int $ucebnicaId
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function index(int $ucebnicaId): JsonResponse
    {
        try {
            $sekcie = $this->sekciaService->vratZoznamSekciiUcebnehoTextu($ucebnicaId, true, true);
        } catch (ModelNotFoundException $exc) {
            return response()->json([
                'error' => $exc->getMessage(),
            ], 404);
        } catch (Exception $exc) {
            return response()->json([
                'error' => $exc->getMessage() ?: class_basename($exc),
            ], 500);
        }

        return response()->json(['data' => $sekcie]);
    }

    /**
     * Display the specified resource.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function show(int $id): JsonResponse
    {
        try {
            $sekcia = $this->sekciaService->vratSekciu($id);
        } catch (ModelNotFoundException $exc) {
            return response()->json([
                'error' => $exc->getMessage(),
            ], 404);
        } catch (Exception $exc) {
            return response()->json([
                'error' => $exc->getMessage() ?: class_basename($exc),
            ], 500);
        }

        return SekciaResource::make($sekcia);
    }

    /**
     * @param \Seka\Vzdelavanie\Http\Requests\Api\SekciaMoveRequest $request
     * @param int                                                   $vzdKnzncKategoriaId
     * @param int                                                   $vzdKnzncUcbnMtrlId
     * @param int                                                   $vzdKnzncSekciaId
     */
    public function update(
        SekciaMoveRequest $request,
        int $vzdKnzncKategoriaId,
        int $vzdKnzncUcbnMtrlId,
        int $vzdKnzncSekciaId,
    ) {
        $node = Sekcia::query()->find($request->get('cielovaSekciaId'));
        $sekcia = Sekcia::query()->find($vzdKnzncSekciaId);

        switch ($request->get('typ')) {
            case 'append':
                $sekcia->appendToNode($node)->save();
                break;
            case 'before':
                $sekcia->insertBeforeNode($node);
                break;
            case 'after':
                $sekcia->insertAfterNode($node);
                break;
        }
    }

    /**
     * @param int $vzdKnzncKategoriaId
     * @param int $vzdKnzncUcbnMtrlId
     * @param int $vzdKnzncSekciaId
     *
     * @return \Illuminate\Http\JsonResponse
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function destroy(int $vzdKnzncKategoriaId, int $vzdKnzncUcbnMtrlId, int $vzdKnzncSekciaId): JsonResponse
    {
        try {
            $sekcia = Sekcia::query()->find($vzdKnzncSekciaId);
            $sekcia->delete();
        } catch (Exception $exc) {
            Log::error($exc->getMessage(), $exc->getTrace());
            return response()->json(['message' => $exc->getMessage()], 500);
        }

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