<?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\Support\Facades\Log;
use Seka\Vzdelavanie\Models\Kniznica\Sekcia;
use Seka\Vzdelavanie\Http\Resources\SekciaResource;
use Seka\Vzdelavanie\Services\SekciaServiceInterface;
use Seka\Vzdelavanie\Http\Controllers\Api\Controller;
use Seka\Vzdelavanie\Http\Requests\Api\SekciaMoveRequest;
use Seka\Vzdelavanie\Repositories\Exceptions\ModelNotFoundException;

/**
 * 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|\Illuminate\Http\Resources\Json\AnonymousResourceCollection
     */
    public function index(int $ucebnicaId)
    {
        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]);
//        return SekciaResource::collection($sekcie);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show(int $id)
    {
        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;
            default:
                return;
        }
    }

    /**
     * @param int $vzdKnzncKategoriaId
     * @param int $vzdKnzncUcbnMtrlId
     * @param int $vzdKnzncSekciaId
     *
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|\Illuminate\Http\Response
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function destroy(int $vzdKnzncKategoriaId, int $vzdKnzncUcbnMtrlId, int $vzdKnzncSekciaId)
    {
        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();
    }
}
