<?php

namespace App\Http\Requests\Backoffice\Menu;

use Illuminate\Foundation\Http\FormRequest;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;

class UpdateMenuRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'menuStructure' => 'array',
        ];
    }

    public function withValidator($validator)
    {
        $validator->after(function ($validator) {
            $this->validateMenuStructure($validator);
        });
    }

    private function validateMenuStructure($validator, $items = null, $path = 'menuStructure')
    {
        if (is_null($items)) {
            $items = $this->input('menuStructure', []);
        }

        $languages = LaravelLocalization::getSupportedLanguagesKeys();

        foreach ($items as $index => $item) {
            $itemPath = "{$path}.{$index}";

            if (!isset($item['id'])) {
                $validator->errors()->add($itemPath, 'Menu item ID is required.');
            }

            if (!isset($item['type'])) {
                $validator->errors()->add($itemPath, 'Menu item type is required.');
            } elseif (!in_array($item['type'], ['object', 'link'])) {
                $validator->errors()->add($itemPath, 'Menu item type must be "object" or "link".');
            }

            foreach ($languages as $lang) {
                $translation = $item['translations'][$lang];

                if (empty($translation['useObjectTitle']) && empty($translation['title'])) {
                    $validator->errors()->add("{$itemPath}.translations.{$lang}.title", "Title is required for {$lang}.");
                }

                if (empty($translation['websiteObjectId']) && empty($translation['url'])) {
                    $validator->errors()->add("{$itemPath}.translations.{$lang}.url", "URL is required for {$lang}.");
                }
            }

            if ($item['type'] === 'object' && !isset($item['websiteObjectId'])) {
                $validator->errors()->add("$itemPath.websiteObjectId", 'Website object ID is required for object type items.');
            }

            if (!empty($item['menuItems'])) {
                $this->validateMenuStructure($validator, $item['menuItems'], "{$itemPath}.menuItems");
            }
        }
    }
}
