<?php

declare(strict_types=1);

namespace App\Http\Requests\File;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator;

class StoreFileUploadRequest extends FormRequest
{
    private const MAX_FILE_SIZE_KB = 12288;

    private const ALLOWED_MIMES = 'jpg,jpeg,png,gif,webp,pdf,doc,docx,xls,xlsx,zip';

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

    public function rules(): array
    {
        return [
            'file' => ['nullable', 'file', 'max:'.self::MAX_FILE_SIZE_KB, 'mimes:'.self::ALLOWED_MIMES],
            'files' => ['nullable', 'array', 'max:10'],
            'files.*' => ['file', 'max:'.self::MAX_FILE_SIZE_KB, 'mimes:'.self::ALLOWED_MIMES],
        ];
    }

    public function withValidator(Validator $validator): void
    {
        $validator->after(function (Validator $validator): void {
            if (! $this->hasFile('file') && ! $this->hasFile('files')) {
                $validator->errors()->add('file', 'حداقل یک فایل برای آپلود الزامی است.');
            }
        });
    }

    public function messages(): array
    {
        return [
            'file.file' => 'فایل ارسالی معتبر نیست.',
            'file.max' => 'حجم فایل نباید بیشتر از ۱۲ مگابایت باشد.',
            'file.mimes' => 'فرمت فایل پشتیبانی نمی‌شود.',
            'files.max' => 'حداکثر ۱۰ فایل در هر درخواست مجاز است.',
            'files.*.file' => 'یکی از فایل‌های ارسالی معتبر نیست.',
            'files.*.max' => 'حجم هر فایل نباید بیشتر از ۱۲ مگابایت باشد.',
            'files.*.mimes' => 'فرمت یکی از فایل‌ها پشتیبانی نمی‌شود.',
        ];
    }

    /**
     * @return array<int, \Illuminate\Http\UploadedFile>
     */
    public function uploadedFiles(): array
    {
        $files = $this->file('files', []);

        if ($this->hasFile('file')) {
            array_unshift($files, $this->file('file'));
        }

        return $files;
    }
}
