<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

use App\Classes\External\Payments\Ezypay;
use App\Models\Account;

class PaymentsEzypayNext extends Command
{
	/**
	 * The name and signature of the console command.
	 *
	 * @var string
	 */
	protected $signature = 'payments:ezypay:next';

	/**
	 * The console command description.
	 *
	 * @var string
	 */
	protected $description = 'Load next payments, and ensure they cover the next invoice';

	/**
	 * Create a new command instance.
	 *
	 * @return void
	 */
	public function __construct()
	{
		parent::__construct();
	}

	/**
	 * Execute the console command.
	 *
	 * @return mixed
	 */
	public function handle()
	{
		$poo = new Ezypay();

		foreach ($poo->getCustomers() as $c)
		{
			if ($c->BillingStatus == 'Inactive')
			{
				$this->info(sprintf('Ignoring INACTIVE: [%s] %s %s',$c->EzypayReferenceNumber,$c->Firstname,$c->Surname));
				continue;
			}

			// Load Account Details from ReferenceId
			$ao = Account::where('site_id',(int)substr($c->ReferenceId,0,2))
				->where('id',(int)substr($c->ReferenceId,2,4))
				->first();

			if (! $ao)
			{
				$this->warn(sprintf('Missing: [%s] %s %s (%s)',$c->EzypayReferenceNumber,$c->Firstname,$c->Surname,$c->ReferenceId));
				continue;
			}

			// Get Due Invoices
			$account_due = $ao->dueInvoices()->sum('due');

			$next_pay = $poo->getDebits([
				'customerId'=>$c->Id,
				'dateFrom'=>now()->format('Y-m-d'),
				'dateTo'=>now()->addQuarter()->format('Y-m-d'),
			])->reverse()->first();

			if ($next_pay->Amount < $account_due)
				$this->warn(sprintf('Next payment for (%s) [%s] not sufficient for outstanding balance [%s]',$ao->name,number_format($next_pay->Amount,2),number_format($account_due,2)));
			elseif ($next_pay->Amount > $account_due)
				$this->warn(sprintf('Next payment for (%s) [%s] is too much for outstanding balance [%s]',$ao->name,number_format($next_pay->Amount,2),number_format($account_due,2)));
			else
				$this->info(sprintf('Next payment for (%s) [%s] will cover outstanding balance [%s]',$ao->name,number_format($next_pay->Amount,2),number_format($account_due,2)));
		}
	}
}