<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CreateThemeRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return $this->user() && $this->user()->isSuperAdmin();
    }

    /**
     * Get the validation rules that apply to the request.
     */
    public function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
            'preview_image' => 'nullable|image|mimes:jpeg,png,webp|max:51200',
            'status' => 'in:draft,published',
            
            // Sections validation
            'sections' => 'required|array|min:1',
            'sections.*.section_type' => 'required|in:hero_banner,image_slider,featured_products,flash_sale,category_grid,brand_showcase,promotional_banner,seasonal_banner,bestsellers,content_block,countdown_timer,newsletter_signup',
            'sections.*.title' => 'nullable|string|max:255',
            'sections.*.background_color' => 'nullable|regex:/^#[A-Fa-f0-9]{6}$/',
            'sections.*.text_color' => 'nullable|regex:/^#[A-Fa-f0-9]{6}$/',
            'sections.*.item_count' => 'nullable|integer|min:1|max:20',
            'sections.*.is_active' => 'boolean',
            'sections.*.config' => 'nullable|array',
            
            // Config validation based on section type
            'sections.*.config.interval' => 'nullable|integer|min:1000|max:30000',
            'sections.*.config.height' => 'nullable|integer|min:200|max:1000',
            'sections.*.config.columns' => 'nullable|integer|in:2,3,4,5,6',
            'sections.*.config.overlay_opacity' => 'nullable|numeric|min:0|max:1',
        ];
    }

    /**
     * Get custom messages for validator errors.
     */
    public function messages(): array
    {
        return [
            'name.required' => 'نام تم الزامی است.',
            'sections.required' => 'حداقل یک بخش باید تعریف شود.',
            'sections.*.section_type.required' => 'نوع بخش الزامی است.',
            'sections.*.section_type.in' => 'نوع بخش نامعتبر است.',
            'sections.*.background_color.regex' => 'رنگ پس‌زمینه باید در فرمت hex باشد (مثال: #FFFFFF).',
            'sections.*.text_color.regex' => 'رنگ متن باید در فرمت hex باشد (مثال: #000000).',
            'sections.*.item_count.max' => 'تعداد آیتم نمی‌تواند بیشتر از 20 باشد.',
            'sections.*.config.interval.min' => 'فاصله اسلایدر نمی‌تواند کمتر از 1000 میلی‌ثانیه باشد.',
            'sections.*.config.interval.max' => 'فاصله اسلایدر نمی‌تواند بیشتر از 30000 میلی‌ثانیه باشد.',
        ];
    }

    /**
     * Configure the validator instance.
     */
    public function withValidator($validator)
    {
        $validator->after(function ($validator) {
            foreach ($this->input('sections', []) as $index => $section) {
                $this->validateSectionConfig($validator, $section, $index);
            }
        });
    }

    /**
     * Validate section-specific configuration rules.
     */
    protected function validateSectionConfig($validator, $section, $index)
    {
        $config = $section['config'] ?? [];
        $type = $section['section_type'];

        switch ($type) {
            case 'image_slider':
                if (isset($config['interval'])) {
                    if ($config['interval'] < 1000 || $config['interval'] > 30000) {
                        $validator->errors()->add(
                            "sections.{$index}.config.interval",
                            'فاصله اسلایدر باید بین 1000 تا 30000 میلی‌ثانیه باشد.'
                        );
                    }
                }
                break;

            case 'hero_banner':
                if (isset($config['height'])) {
                    if ($config['height'] < 200 || $config['height'] > 1000) {
                        $validator->errors()->add(
                            "sections.{$index}.config.height",
                            'ارتفاع بنر باید بین 200 تا 1000 پیکسل باشد.'
                        );
                    }
                }
                if (isset($config['overlay_opacity'])) {
                    if ($config['overlay_opacity'] < 0 || $config['overlay_opacity'] > 1) {
                        $validator->errors()->add(
                            "sections.{$index}.config.overlay_opacity",
                            'شفافیت باید بین 0 تا 1 باشد.'
                        );
                    }
                }
                break;

            case 'featured_products':
            case 'bestsellers':
                if (isset($config['count'])) {
                    if ($config['count'] > 20) {
                        $validator->errors()->add(
                            "sections.{$index}.config.count",
                            'تعداد محصولات نمی‌تواند بیشتر از 20 باشد.'
                        );
                    }
                }
                break;

            case 'countdown_timer':
                if (isset($config['target_datetime'])) {
                    try {
                        $targetDate = new \DateTime($config['target_datetime']);
                        $now = new \DateTime();
                        if ($targetDate <= $now) {
                            $validator->errors()->add(
                                "sections.{$index}.config.target_datetime",
                                'تاریخ شمارش معکوس باید در آینده باشد.'
                            );
                        }
                    } catch (\Exception $e) {
                        $validator->errors()->add(
                            "sections.{$index}.config.target_datetime",
                            'فرمت تاریخ نامعتبر است.'
                        );
                    }
                }
                break;
        }
    }
}
