<?php

namespace App\Console\Commands\Areafix;

use Illuminate\Console\Command;

use App\Jobs\AreafixRescan;
use App\Models\{Address,Echoarea};

class Rescan extends Command
{
	/**
	 * The name and signature of the console command.
	 *
	 * @var string
	 */
	protected $signature = 'areafix:rescan'
		.' {ftn : FTN Address}'
		.' {area : Echoarea Tag}'
		.' {days? : Limit to messages authored days ago}'
		.' {--j|queue : Queue the Job}'
		.' {--Q|queuename=default : Queue on queue}'
		.' {--R|export : Re-export previously sent messages}';

	/**
	 * The console command description.
	 *
	 * @var string
	 */
	protected $description = 'Resend some echomail to a node';

	/**
	 * Execute the console command.
	 *
	 * @return int
	 * @throws \Exception
	 */
	public function handle(): int
	{
		if (($this->argument('days')) && (! is_numeric($this->argument('days'))))
			throw new \Exception('Days must be numeric: '.$this->argument('days'));

		$ao = Address::findFtn($this->argument('ftn'));

		if (! $ao)
			throw new \Exception('FTN not found: '.$this->argument('ftn'));

		// Check that the area belongs to the domain for the FTN
		if (! $this->argument('area'))
			throw new \Exception('Areaname is required');

		$eo = Echoarea::where('name',$this->argument('area'))->sole();

		if ($eo->domain_id !== $ao->zone->domain_id)
			throw new \Exception(sprintf('Echo area [%s] is not in domain [%s] for FTN [%s]',$eo->name,$ao->zone->domain->name,$ao->ftn));

		if ($this->option('queue'))
			AreafixRescan::dispatch($ao,$eo,$this->argument('days'))->onQueue($this->option('queuename'));
		else
			AreafixRescan::dispatchSync($ao,$eo,$this->argument('days'));

		return self::SUCCESS;
	}
}