<?php

namespace App\Http\Controllers;

use App\Guide;
use App\News;
use Illuminate\Http\Response;
use Illuminate\Http\Request;
use tidy;

class GuideController extends Controller
{
    public function __construct()
    {
        $this->middleware([ "auth" ]);
        $this->middleware([ "lang" ]);

        $this->middleware([ "check.auth:guides.list" ])->only("index");
        $this->middleware([ "check.auth:guides.show" ])->only("show");
        $this->middleware([ "check.auth:guides.create" ])->only("create", "store");
        $this->middleware([ "check.auth:guides.edit" ])->only("edit", "update");
        $this->middleware([ "check.auth:guides.delete" ])->only("delete");
    }



    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $guides = Guide::query()->orderBy("created_at", "desc")->paginate($request->input("limit", 20));

        return Response::detect("guides.index", [ "guides" => $guides]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return Response::detect("guides.create");
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {

        //Me no sure what to store mester big smoke :)
        $requestGuide = $request->validate([
            "name" => "required|max:255",
            "guide_articles" => "required",
        ]);

        $guide = new Guide($requestGuide);

        if($request->file("resource")) {
            $guide->resource_id = ResourceController::store($request)->id;
        }

        $saved = $guide->save();

        if(!$saved) {
            return redirect()->route("guides.store");
        } else {
            $guides = Guide::query()->paginate($request->input("limit", 20));

            if($request->newsoption == true){
                $news = new News();

                $news->name = "Ny vejledning";
                $news->subname = $guide->name;
                $news->arrangement_id = $guide->id;
                $news->type_id = '4';

                $news->content = $guide->guide_articles;

                if($guide->resource_id !== null)
                    $news->resource_id = $guide->resource_id;

                NewsController::storeAndGet($news);
            }

            return redirect()->route("guides.index", ['guides' => $guides]);
        }
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Guide  $guide
     * @return \Illuminate\Http\Response
     */
    public function show(Guide $guide)
    {
        return Response::detect("guides.show", [ "guide" => $guide]);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Guide  $guide
     * @return \Illuminate\Http\Response
     */
    public function edit(Guide $guide)
    {
        $guidee = Guide::query()->where("id", "=", $guide->id)->first();
        return Response::detect("guides.edit", ["guide" => $guidee]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Guide  $guide
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Guide $guide)
    {
        $data = $request->validate([
            "name" => "required|max:255",
            "guide_articles" => "required",
        ]);

        $guidee = Guide::query()->where("id", "=", $guide->id)->first();
        $guidee->update($data);
        $saved = $guidee->save();

        if(!$saved){
            return redirect()->route("guides.update", [ "guide" => $guide ]);
        }else{
            $guides = Guide::query()->paginate($request->input("limit", 20));

            if($request->newsoption == true){
                $news = new News();

                $news->name = "Vejledning opdateret";
                $news->subname = $guidee->name;
                $news->arrangement_id = $guide->id;
                $news->type_id = '4';

                $news->content = $this->closetags(substr($guidee->guide_articles, 0, 300)). '<br><a style="font-weight: 700;" href="' . route("guides.show", ["guide" => $guide]). '" class="sde-blue ">Læs mere</a>';

                NewsController::storeAndGet($news);
            }

            return redirect()->route("guides.index", ['guides' => $guides]);
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  Guide  $guide
     * @return \Illuminate\Http\Response
     */
    public function destroy($guide)
    {
        $guide = Guide::find($guide);
        $news = News::query()->where("type_id", "=", "4")->where("arrangement_id", "=", $guide->id)->first();

        $news->delete();
        $guide->delete();


        return redirect()->route("guides.index");
    }

    public function closetags($html) {
        preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
        $openedtags = $result[1];
        preg_match_all('#</([a-z]+)>#iU', $html, $result);
        $closedtags = $result[1];
        $len_opened = count($openedtags);
        if (count($closedtags) == $len_opened) {
            return $html;
        }
        $openedtags = array_reverse($openedtags);
        for ($i=0; $i < $len_opened; $i++) {
            if (!in_array($openedtags[$i], $closedtags)) {
                $html .= '</'.$openedtags[$i].'>';
            } else {
                unset($closedtags[array_search($openedtags[$i], $closedtags)]);
            }
        }
        return $html;
    }

}