<?php

declare(strict_types=1);

namespace App\Http\Requests\Discussion;

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

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

    public function rules(): array
    {
        return [
            'project_id' => ['required', 'integer', 'exists:projects,id'],
            'title' => ['required', 'string', 'min:2', 'max:255'],
            'hashtag' => ['nullable', 'string', 'max:100'],
            'initial_message' => ['required', 'string', 'min:1', 'max:10000'],
            'participant_mode' => ['nullable', 'string', Rule::in(['all_project', 'specific'])],
            'user_ids' => ['required_if:participant_mode,specific', 'nullable', 'array', 'min:1'],
            'user_ids.*' => ['integer', 'exists:users,id'],
        ];
    }

    public function messages(): array
    {
        return [
            'project_id.required' => 'انتخاب پروژه الزامی است.',
            'project_id.exists' => 'پروژه انتخاب‌شده معتبر نیست.',
            'title.required' => 'نام بحث الزامی است.',
            'initial_message.required' => 'پیام اولیه الزامی است.',
            'participant_mode.in' => 'نوع شرکت‌کنندگان معتبر نیست.',
            'user_ids.required_if' => 'انتخاب حداقل یک کاربر الزامی است.',
        ];
    }

    protected function prepareForValidation(): void
    {
        if (! $this->filled('participant_mode')) {
            $this->merge(['participant_mode' => 'all_project']);
        }

        if ($this->filled('hashtag')) {
            $hashtag = ltrim((string) $this->input('hashtag'), '#');
            $this->merge(['hashtag' => $hashtag !== '' ? '#' . $hashtag : null]);
        }
    }
}
