<?php

namespace App\Http\Requests;

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

use App\Models\Invoice;

/**
 * Editing Suppliers
 */
class PaymentAddEdit extends FormRequest
{
	/**
	 * Determine if the user is authorized to make this request.
	 *
	 * @return bool
	 */
	public function authorize()
	{
		return Gate::allows('wholesaler');
	}

	/**
	 * Get the validation rules that apply to the request.
	 *
	 * @return array<string, mixed>
	 */
	public function rules()
	{
		return [
			'account_id' => 'required|exists:accounts,id',
			'paid_at' => 'required|date',
			'checkout_id' => 'required|exists:checkouts,id',
			'total_amt' => 'required|numeric|min:0.01',
			'fees_amt' => 'nullable|numeric|lt:total_amt',
			'source_id' => 'nullable|exists:accounts,id',
			'pending' => 'nullable|boolean',
			'notes' => 'nullable|string',
			'ip' => 'nullable|ip',
			'invoices' => [
				'nullable',
				'array',
				function($attribute,$value,$fail) {
					if (($x=collect($value)->sum()) > request()->post('total_amt'))
						$fail(sprintf('Allocation %3.2f is greater than payment total %3.2f.',$x,request()->post('total_amt')));
				}
			],
			'invoices.*' => [
				'nullable',
				function($attribute,$value,$fail) {
					if (! ($x=Invoice::where('id',$xx=str_replace('invoices.','',$attribute))->first()))
						$fail(sprintf('Invoice [%d] doesnt exist in DB',$xx));
					// @todo The due amount may be influenced by this payment (ie: payment edit)
					elseif($x->due < $value)
						$fail(sprintf('Invoice [%d] is over allocated by %3.2f',$x->id,$value-$x->due));
				}
			],
		];
	}
}