<?php

namespace App\Http\Requests;

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

use App\Models\{Address,System};

class AddressMerge extends FormRequest
{
	protected $stopOnFirstFailure = TRUE;

	public function authorize()
	{
		return Gate::allows('admin');
	}

	public function rules(Request $request)
	{
		if (! $request->isMethod('post'))
			return [];

		return [
			'src' => [
				'required',
				'exists:addresses,id',
			],
			'dst' => [
				'required',
				'exists:addresses,id',
				'different:src',
				function ($attribute,$value,$fail) use ($request) {
					$dst = Address::withTrashed()->findOrFail($value);
					$src = Address::withTrashed()->findOrFail($request->src);

					if ((! $dst->active) && ($dst->system_id !== $src->system_id) && ($src->system->name !== System::default))
						$fail('Destination must be active, or be from the same system');
				},
				function ($attribute,$value,$fail) use ($request) {
					$dst = Address::withTrashed()->findOrFail($value);
					$src = Address::withTrashed()->findOrFail($request->src);

					if ($src->zone->domain->flatten && $dst->zone->domain->flatten) {
						if ((! $src->zone->domain->zones->pluck('id')->contains($dst->zone_id)) || (! $dst->zone->domain->zones->pluck('id')->contains($src->zone_id)))
							$fail('Source must be Destination\'s domain zone');

					} elseif ($src->ftn !== $dst->ftn)
						$fail('Source and Destination must be the same FTN');
				},
			],
		];
	}
}