<?php
namespace App\Http\Requests;
use App\Models\Application;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class StoreComplaintRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
/**
* @return array<string, mixed>
*/
public function rules(): array
{
// Aplikasi is only required when the picked instansi actually has one
// registered (§2) — some instansi may not have any web app on file yet.
$clientHasApplications = Application::query()
->where('client_id', $this->input('client_id'))
->where('is_active', true)
->exists();
return [
'client_id' => ['required', 'uuid', Rule::exists('client', 'id')->where('is_active', true)],
'application_id' => [
Rule::requiredIf($clientHasApplications),
'nullable', 'uuid',
Rule::exists('application', 'id')->where('client_id', $this->input('client_id'))->where('is_active', true),
],
'subject' => ['required', 'string', 'max:255'],
'description' => ['required', 'string', 'max:5000'],
'report_by' => ['required', 'string', 'max:255'],
'photos' => ['nullable', 'array', 'max:5'],
'photos.*' => ['file', 'mimes:jpg,jpeg,png,pdf', 'max:5120'],
'is_urgent' => ['nullable', 'boolean'],
// Honeypot (see complaint/create.blade.php): real visitors never fill this.
'website' => ['prohibited'],
];
}
/**
* @return array<string, string>
*/
public function messages(): array
{
return [
'client_id.required' => 'Silakan pilih instansi.',
'client_id.exists' => 'Instansi yang dipilih tidak valid atau sudah tidak aktif.',
'application_id.required' => 'Silakan pilih aplikasi/website yang bermasalah.',
'application_id.exists' => 'Aplikasi yang dipilih tidak valid untuk instansi ini.',
'photos.max' => 'Maksimal 5 foto bukti per tiket.',
'photos.*.max' => 'Ukuran tiap foto maksimal 5MB.',
];
}
}