<?php

namespace App\Http\Controllers\Admin;

use App\Facades\ContentTypes;
use App\Facades\RequestContext;
use App\Facades\Services\BackendUserService;
use App\Facades\Services\BackofficeService;
use App\Http\Controllers\Controller;
use App\Http\Requests\AdminMenuItemCreate;
use App\Models\GenericBackoffice\Menu;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;

class MenuController extends Controller
{
    public function getEdit($menuId)
    {
        $menu = Menu::find($menuId);
        if (is_null($menu)) {
            abort(404, trans("response.not_found"));
        }

        RequestContext::set('selected_menu', 'admin_menus');
        RequestContext::set('selected_menu_option', 'admin_menu_'.$menu->id);

        $contentType = ContentTypes::find('page');
        $pages = $contentType->toList();

        $structuredMenu = $menu->getStructuredItems();
        $user = BackendUserService::getLoggedUser();

        return view('admin.pages.menus.edit_menu')
            ->with([
                'user' => $user,
                'menu' => $menu,
                'pages' => $pages,
                'menuItems' => $structuredMenu
            ]);
    }

    public function postCreateMenuItem(AdminMenuItemCreate $request)
    {

        try {
            $data = $request->validated();
        } catch (ValidationException $e) {
            $result = array(
                'success' => false,
                'errors' => $e->errors()
            );
            return response()->json($result);
        }

        $tempMenuItem = BackofficeService::createTempMenuItem($data);

        $viewHtml = view('admin.pages.menus.menu_item')
            ->with('menuItem', $tempMenuItem)
            ->render();
        $result = array(
            'success' => true,
            'menu_item_html' => $viewHtml
        );

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

    private function itemRules($type, $groupIndex = null)
    {
        $languages = LaravelLocalization::getSupportedLanguagesKeys();
        if ($groupIndex) {
            $groupIndex = '['.$groupIndex.']';
        }
        if ($type == 'link') {
            $rules = generateLangRules(array(
                'title'.$groupIndex => 'required|max:100',
                'url'.$groupIndex => 'required|max:255'
            ), $languages);
        } else {
            $rules = generateLangRules(array(
                'title'.$groupIndex => 'required|max:100',
            ), $languages);
        }
        return $rules;
    }

    public function postEdit($menuId)
    {
        $menu = Menu::find($menuId);
        if (is_null($menu)) {
            abort(404, trans("response.not_found"));
        }

        $ids = request()->input('menu_id');
        $ids = $ids ? $ids : array();
        $menuStructure = json_decode(request()->input('menu_structure'));
        $types = request()->input('menu_type');
        $titles = request()->input('title');
        $urls = request()->input('url');
        $states = request()->input('active');
        $newWindows = request()->input('new_window');
        $entriesIds = request()->input('entry_id');
        $toDelete = request()->input('to_delete');
        $contentType = ContentTypes::find('page');
        $pages = $contentType->toList();

        $data = array(
            'titles' => $titles,
            'types' => $types,
            'urls' => $urls,
            'states' => $states,
            'new_windows' => $newWindows,
            'entry_id' => $entriesIds
        );
        $counter = 0;
        BackofficeService::buildStructure($menuStructure, $counter, $data);

        //Validation
        $menuErrors = array();
        foreach ($ids as $itemId) {
            //validation fields
            $itemValidationFields = array(
                'title['.$itemId.']' => $titles[$itemId]
            );
            if ($types[$itemId] == 'link') {
                $itemValidationFields['url['.$itemId.']'] = $urls[$itemId];
            }

            $validator = Validator::make(
                $itemValidationFields,
                $this->itemRules($types[$itemId], $itemId)
            );

            if ($validator->fails()) {
                $menuErrors[$itemId] = $validator->errors();
            }
        }

        if (sizeof($menuErrors) > 0) {
            return view('admin.pages.menus.edit_menu')
                ->with(array(
                    'menu' => $menu,
                    'pages' => $pages,
                    'menuItems' => $menuStructure,
                    'menu_errors' => $menuErrors,
                    'to_delete' => $toDelete
                ));
        }

        BackofficeService::saveMenu($menu, $menuStructure, $toDelete);

        return response()->redirectTo('/admin/menu/edit/'.$menuId)->with("message", trans('backend.save_success'));
    }


}
