<?php

namespace App\Http\Requests;

use App\Models\AppPromotionalBannerSetting;
use App\Traits\ConvertsBase64ToFiles;
use Illuminate\Foundation\Http\FormRequest;

class AppPromotionalBannerSettingRequest extends FormRequest
{
    use ConvertsBase64ToFiles;

    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'title' => 'required|string|min:2|max:180',
            'is_active' => 'required|boolean',
            'image' => $this->imageRule(),
        ];
    }

    protected function prepareForValidation()
    {
        $input = $this->input();

        if (isset($input['data']['attributes']) && is_array($input['data']['attributes'])) {
            $input = $input['data']['attributes'];
        }

        $input['is_active'] = filter_var(
            $input['is_active'] ?? false,
            FILTER_VALIDATE_BOOLEAN,
            FILTER_NULL_ON_FAILURE
        ) ?? false;

        if (isset($input['image']) && !isImageBase64($input['image'])) {
            unset($input['image']);
            $this->replace($input);
            return;
        }

        $this->replace($input ?? []);
        $this->convertBase64ToFiles();
    }

    protected function base64FileKeys(): array
    {
        return ['image'];
    }

    protected function imageRule(): array
    {
        $hasCurrentImage = (bool) optional(AppPromotionalBannerSetting::query()->first())->image;

        return [
            $hasCurrentImage ? 'nullable' : 'required',
            'image',
            'mimes:webp,jpg,jpeg,png',
            'dimensions:min_width=2430,min_height=320',
        ];
    }
}
