<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Symfony\Component\HttpFoundation\File\File;

use App\Classes\FTN\Packet;
use App\Jobs\ProcessPacket as Job;
use App\Models\Domain;

class PacketInfo extends Command
{
	/**
	 * The name and signature of the console command.
	 *
	 * @var string
	 */
	protected $signature = 'packet:info {pkt : Packet to process} {domain : Domain the packet is from}';

	/**
	 * The console command description.
	 *
	 * @var string
	 */
	protected $description = 'Packet Information';

	/**
	 * Execute the console command.
	 *
	 * @return mixed
	 * @throws \App\Classes\FTN\InvalidPacketException
	 */
	public function handle()
	{
		$f = new File($this->argument('pkt'));
		$d = Domain::where('name',$this->argument('domain'))->singleOrFail();

		$pkt = Packet::open($f,$d);

		$this->info(sprintf('Packet Type: %s',$pkt->type));
		$this->info(sprintf('From: %s to %s',$pkt->fftn,$pkt->tftn));
		$this->info(sprintf('Dated: %s',$pkt->date));
		$this->info(sprintf('Password: %s (%s)',$pkt->password,$pkt->password ? 'SET' : 'NOT set'));
		$this->info(sprintf('Messages: %d',$pkt->messages->count()));
		$this->info(sprintf('Tosser %d (%s) version %s',$pkt->software->code,$pkt->software->name,$pkt->software_ver));
		$this->info(sprintf('Capabilities: %x',$pkt->capability));
		$this->info(sprintf('Has Errors: %s',$pkt->errors->count() ? 'YES' : 'No'));

		foreach ($pkt as $msg) {
			$this->warn(sprintf('- Date: %s',$msg->date));
			$this->warn(sprintf('  - FLAGS: %s',$msg->flags()->filter()->keys()->join(', ')));
			$this->warn(sprintf('  - From: %s (%s)',$msg->user_from,$msg->fftn));
			$this->warn(sprintf('  - To: %s (%s)',$msg->user_to,$msg->tftn));
			$this->warn(sprintf('  - Subject: %s',$msg->subject));

			if ($msg->errors)
				foreach ($msg->errors->errors()->all() as $error)
					$this->line('  - '.$error);
		}

		foreach ($pkt->errors as $msg) {
			$this->error(sprintf('- Date: %s',$msg->date));
			$this->error(sprintf('  - FLAGS: %s',$msg->flags()->filter()->keys()->join(', ')));
			$this->error(sprintf('  - From: %s (%s)',$msg->user_from,$msg->fftn));
			$this->error(sprintf('  - To: %s (%s)',$msg->user_to,$msg->tftn));
			$this->error(sprintf('  - Subject: %s',$msg->subject));

			foreach ($msg->errors->errors()->all() as $error)
				$this->line('  - '.$error);
		}
	}
}