<?php

namespace Modules\Menu\Http\Controllers\Admin;

use Modules\Menu\Entities\Menu;
use Modules\Menu\Entities\MenuItem;
use Modules\Admin\Ui\Facades\TabManager;
use Modules\Menu\Http\Requests\SaveMenuItemRequest;

class MenuItemController
{
    /**
     * Show the form for creating a new resource.
     *
     * @param int $menuId
     * @return \Illuminate\Http\Response
     */
    public function create($menuId)
    {
        $menuItem = new MenuItem;
        $tabs = TabManager::get('menu_items');

        return view('menu::admin.menu_items.create', compact('menuId', 'menuItem', 'tabs'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param int $menuId
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store($menuId, SaveMenuItemRequest $request)
    {
        $menuItem = MenuItem::create(
            $this->prepare($menuId, $request->all())
        );

        return redirect()->route('admin.menus.edit', $menuId)
            ->withSuccess(trans('admin::messages.resource_saved', ['resource' => trans('menu::menu_items.menu_item')]));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param int $menuId
     * @param int $id
     * @return \Illuminate\Http\Response
     */
    public function edit($menuId, $id)
    {
        $menuItem = MenuItem::withoutGlobalScope('active')->findOrFail($id);
        $tabs = TabManager::get('menu_items');

        return view('menu::admin.menu_items.edit', compact('menuId', 'menuItem', 'tabs'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param int $menuId
     * @param int $id
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function update($menuId, $id, SaveMenuItemRequest $request)
    {
        MenuItem::withoutGlobalScope('active')
            ->findOrFail($id)
            ->update(
                $this->prepare($menuId, $request->all())
            );

        return redirect()->route('admin.menus.edit', $menuId)
            ->withSuccess(trans('admin::messages.resource_saved', ['resource' => trans('menu::menu_items.menu_item')]));
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param int $id
     * @return void
     */
    public function destroy($id)
    {
        MenuItem::withoutGlobalScope('active')->findOrFail($id)->delete();
    }

    /**
     * Prepare menu item attributes for saving.
     *
     * @param int $menuId
     * @param array $attributes
     * @return array
     */
    private function prepare($menuId, array $attributes)
    {
        if (is_null($attributes['parent_id'])) {
            $attributes['parent_id'] = $this->parentId($menuId);
        }

        return array_merge($attributes, ['menu_id' => $menuId]);
    }

    /**
     * Get parent id for the given menu id.
     *
     * @param string string
     * @return int
     */
    private function parentId($menuId)
    {
        return MenuItem::withoutGlobalScope('not_root')
            ->where('menu_id', $menuId)
            ->value('id');
    }
}