<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RegisterGameAccountRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    /**
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'username' => ['required', 'string', 'min:3', 'max:32', 'regex:/^[A-Za-z0-9]+$/'],
            'email' => ['required', 'string', 'email:rfc', 'max:255'],
            'invite_code' => ['required', 'string', 'min:6', 'max:32'],
            'password' => ['required', 'string', 'min:8', 'max:32', 'confirmed', 'regex:/^(?=.*[A-Za-z])(?=.*\d).+$/'],
            'terms' => ['accepted'],
        ];
    }

    /**
     * @return array<string, string>
     */
    public function messages(): array
    {
        return [
            'username.required' => 'Укажи логин аккаунта.',
            'username.string' => 'Логин должен быть строкой.',
            'username.min' => 'Логин должен содержать минимум 3 символа.',
            'username.max' => 'Логин не должен быть длиннее 32 символов.',
            'username.regex' => 'Логин может содержать только латинские буквы и цифры.',
            'email.required' => 'Укажи email для аккаунта.',
            'email.string' => 'Email должен быть строкой.',
            'email.email' => 'Укажи корректный email адрес.',
            'email.max' => 'Email не должен быть длиннее 255 символов.',
            'invite_code.required' => 'Укажи инвайт-код.',
            'invite_code.string' => 'Инвайт-код должен быть строкой.',
            'invite_code.min' => 'Инвайт-код выглядит слишком коротким.',
            'invite_code.max' => 'Инвайт-код выглядит слишком длинным.',
            'password.required' => 'Укажи пароль.',
            'password.string' => 'Пароль должен быть строкой.',
            'password.min' => 'Пароль должен содержать минимум 8 символов.',
            'password.max' => 'Пароль не должен быть длиннее 32 символов.',
            'password.confirmed' => 'Подтверждение пароля не совпадает.',
            'password.regex' => 'Пароль должен содержать хотя бы одну букву и одну цифру.',
            'terms.accepted' => 'Нужно принять правила сервера и пользовательское соглашение.',
        ];
    }

    /**
     * @return array<string, string>
     */
    public function attributes(): array
    {
        return [
            'username' => 'логин аккаунта',
            'email' => 'email',
            'invite_code' => 'инвайт-код',
            'password' => 'пароль',
            'terms' => 'правила',
        ];
    }
}
