<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;

use App\Models\Domain;

/**
 * Validation to register echoareas for a system
 * o = System::class
 *
 * @note This validation only expects to be used with POST
 * Variables:
 * + "address_id" => "address"		// address_id that will receive the echos
 * + "domain_id" => "domain"		// Of the echoareas
 * + "id" => array of IDs			// The echos being subscribed (or if absent, are removed)
 *
 * Rules:
 * @see AddressAdd::class for description of authorisation
 */
class SystemEchoareaRequest extends FormRequest
{
	/**
	 * Determine if the user is authorized to make this request.
	 */
	public function authorize(): bool
	{
		return request()->isMethod('get')
			|| Gate::allows('update_nn',$this->route('o'));
	}

	/**
	 * Get the validation rules that apply to the request.
	 *
	 * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
	 */
	public function rules(Request $request): array
	{
		if (request()->isMethod('get'))
			return [];

		session()->flash('accordion','echoarea');
		return [
			'address_id'=>[
				'exists:addresses,id',
				// Make sure we have session details for the area
				function ($attribute,$value,$fail) use ($request) {
					$ao = request()->route('o')->addresses->firstWhere('id',$request->address_id);

					if ((! $ao) || (! $ao->active) || (! $ao->system->zones->pluck('domain_id')->contains($request->domain_id)))
						$fail('Address must be ACTIVE, and have session details for the domain');
				},
			],
			'domain_id'=>'exists:domains,id',
			'id'=>[
				'array',
				'min:1',
				// Make sure the echoareas are in the domain
				function ($attribute,$value,$fail) use ($request) {
					$do = Domain::findOrFail($request->domain_id);

					if ($do->echoareas->pluck('id')->intersect($value)->count() !== count($value))
						$fail('Some echaoreas dont exist in the domain?');
				},
			]
		];
	}
}