<?php

namespace App\Providers;

use Illuminate\Http\Request;
use Illuminate\Notifications\ChannelManager;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\ServiceProvider;

use App\Events\Matrix\Message;
use App\Listeners\EchomailListener;
use App\Listeners\Matrix\MessageListener;
use App\Notifications\Channels\{EchomailChannel,MatrixChannel,NetmailChannel};
use App\Models\{Echomail,Netmail};
use App\Traits\SingleOrFail;

class AppServiceProvider extends ServiceProvider
{
	use SingleOrFail;

	/**
	 * Register any application services.
	 *
	 * @return void
	 */
	public function register()
	{
		Notification::resolved(function (ChannelManager $service) {
			$service->extend('echomail', function ($app) {
				return new EchomailChannel($app->make(Echomail::class));
			});

			$service->extend('netmail', function ($app) {
				return new NetmailChannel($app->make(Netmail::class));
			});

			$service->extend('matrix', function ($app) {
				return new MatrixChannel($app->make(Echomail::class));
			});
		});
	}

	/**
	 * Bootstrap any application services.
	 *
	 * @return void
	 */
	public function boot()
	{
		static::bootSingleOrFail();

		Auth::viaRequest('matrix-token',function (Request $request) {
			return (config('matrix.hs_token') && ($request->bearerToken() === config('matrix.hs_token'))) ? TRUE : NULL;
		});

		Event::listen(
			Message::class,
			MessageListener::class,
		);

		// @todo This should be detected automatically?
		Event::listen(
			\App\Events\Echomail::class,
			EchomailListener::class,
		);
	}
}