<?php

namespace App\Http\Requests\Merchant;

use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;

class StoreMerchantRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return auth()->check() && (auth()->user()->isAdmin() || auth()->user()->isStaff());
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'business_type_id' => 'required|exists:business_types,id',
            'full_name' => 'required|string|max:255',
            'birth_date' => 'required|date|before:today',
            'identity_number' => 'required|string|max:50|unique:merchants,identity_number',
            'identity_type' => 'required|string|in:BI,Passaporte,Outro',
            'tax_number' => 'required|string|max:50|unique:merchants,tax_number',
            'phone' => 'required|string|max:20',
            'alternate_phone' => 'nullable|string|max:20',
            'email' => 'nullable|email|max:255|unique:merchants,email',
            'address' => 'required|string|max:500',
            'photo_url' => 'nullable|url',
            'metadata' => 'nullable|array',
        ];
    }

    /**
     * Get custom messages for validator errors.
     *
     * @return array<string, string>
     */
    public function messages(): array
    {
        return [
            'business_type_id.required' => 'O tipo de negócio é obrigatório.',
            'business_type_id.exists' => 'Tipo de negócio inválido.',
            'full_name.required' => 'O nome completo é obrigatório.',
            'birth_date.required' => 'A data de nascimento é obrigatória.',
            'birth_date.before' => 'A data de nascimento deve ser anterior a hoje.',
            'identity_number.required' => 'O número de identidade é obrigatório.',
            'identity_number.unique' => 'Este número de identidade já está em uso.',
            'identity_type.required' => 'O tipo de identidade é obrigatório.',
            'identity_type.in' => 'Tipo de identidade inválido.',
            'tax_number.required' => 'O número fiscal é obrigatório.',
            'tax_number.unique' => 'Este número fiscal já está em uso.',
            'phone.required' => 'O telefone é obrigatório.',
            'email.email' => 'O email deve ser um endereço válido.',
            'email.unique' => 'Este email já está em uso.',
            'address.required' => 'O endereço é obrigatório.',
            'photo_url.url' => 'A URL da foto deve ser válida.',
        ];
    }
}
