<?php

namespace App\Notifications;

use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;

use App\Classes\FTN\Message;
use App\Models\{Echoarea, Echomail, Setup, System};

abstract class Echomails extends Notification //implements ShouldQueue
{
	use Queueable;

	protected const via = 'echomail';

	private const LOGKEY = 'NN-';

	/**
	 * Create a new notification instance.
	 */
	public function __construct()
	{
		$this->queue = 'echomail';
	}

	/**
	 * Get the notification's delivery channels.
	 *
	 * @param mixed $notifiable
	 * @return array
	 */
	public function via($notifiable)
	{
		return [ self::via ];
	}

	/**
	 * Get the mail representation of the notification.
	 *
	 * @param System $so
	 * @param mixed $notifiable
	 * @return Echomail
	 * @throws \Exception
	 */
	abstract public function toEchomail(System $so,object $notifiable): Echomail;

	protected function setupEchomail(Message $mo,System $so,object $notifiable): Echomail
	{
		$echoarea = $notifiable->routeNotificationFor(static::via);
		$eo = Echoarea::where('name',$echoarea)->singleOrFail();

		$o = new Echomail;
		$o->init();
		$o->from = Setup::PRODUCT_NAME;
		$o->replyid = $mo->msgid;
		$o->echoarea_id = $eo->id;

		$o->datetime = Carbon::now();
		$o->tzoffset = $o->datetime->utcOffset();

		$o->fftn_id = ($x=$so->match($mo->fftn_o->zone)->first())->id;
		$o->flags = (Message::FLAG_LOCAL);

		$o->tearline = sprintf('%s (%04X)',Setup::PRODUCT_NAME,Setup::PRODUCT_ID);
		$o->origin = sprintf('%s (%s)',Setup::PRODUCT_NAME,$x->ftn4d);
		$o->kludges = collect(['chrs'=>$mo->kludge->get('chrs') ?: 'CP437 2']);

		return $o;
	}
}