<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\File;

use App\Ldap\Entry;
use App\Classes\LDAP\Server;

class HomeController extends Controller
{
	public function home()
	{
		$o = new Server;

		return view('home')
			->with('server',config('ldap.connections.default.name'))
			->with('bases',$o->getBaseDN()->transform(function($item) {
				return [
					'title'=>$item,
					'item'=>Crypt::encryptString($item),
					'lazy'=>TRUE,
					'icon'=>'fa-fw fas fa-sitemap',
					'tooltip'=>$item,
				];
			}));
	}

	public function info()
	{
		$attrs = collect((new Entry)->rootDSE()->getAttributes())
			->transform(function($item,$key) {
				foreach ($item as $k=>$v) {
					if (preg_match('/[0-9]+\.[0-9]+\.[0-9]+/',$v)) {
						$format = sprintf(
							'<abbr class="pb-1" title="%s"><i class="fas fa-list-ol pr-2"></i>%s</abbr>%s<p class="mb-0">%s</p>',
							$v,
							Server::getOID($v,'title'),
							($x=Server::getOID($v,'ref')) ? sprintf('<abbr class="pl-2" title="%s"><i class="fas fa-comment-dots"></i></abbr>',$x) : '',
							Server::getOID($v,'desc'),
						);
						$item[$k] = $format;
					}
				}
				return $item;
			});

		return view('widgets.dn')
			->with('dn','Server Info')
			->with('attributes',$this->sortAttrs($attrs));
	}

	public function render(Request $request)
	{
		$dn = Crypt::decryptString($request->post('key'));

		return view('widgets.dn')
			->with('dn',$dn)
			->with('leaf',$x=(new Server())->fetch($dn))
			->with('attributes',$this->sortAttrs(collect($x->getAttributes())));
	}

	/**
	 * Sort the attributes
	 *
	 * @param Collection $attrs
	 * @return Collection
	 */
	private function sortAttrs(Collection $attrs): Collection
	{
		return $attrs->sortKeys();
	}

	/**
	 * Return the image for the logged in user or anonymous
	 *
	 * @param Request $request
	 * @return mixed
	 */
	public function user_image(Request $request)
	{
		$image = NULL;
		$content = NULL;

		if (Auth::check()) {
			$image = Arr::get(Auth::user()->getAttribute('jpegphoto'),0);
			$content = 'image/jpeg';
		}

		if (! $image) {
			$image = File::get('../resources/images/user-secret-solid.svg');
			$content = 'image/svg+xml';
		}

		return response($image)
			->header('Content-Type',$content);
	}
}