<?php

namespace App\Services;

use Auth;
use App\ModLog;
use App\Notification;
use App\User;

class ModLogService {

	protected $log;

	public function __construct()
	{
		$this->log = new \StdClass;
	}

	public static function boot()
	{
		return new self;
	}

	public function user(User $user)
	{
		$this->log->user = $user;
		return $this;
	}

	public function objectUid($val = null)
	{
		$this->log->object_uid = $val;
		return $this;
	}

	public function objectId($val = null)
	{
		$this->log->object_id = $val;
		return $this;
	}

	public function objectType($val = null)
	{
		$this->log->object_type = $val;
		return $this;
	}

	public function action($val = null)
	{
		$this->log->action = $val;
		return $this;
	}

	public function message($val = null)
	{
		$this->log->message = $val;
		return $this;
	}

	public function metadata(array $val = null)
	{
		$this->log->metadata = json_encode($val);
		return $this;
	}

	public function accessLevel($val = null)
	{
		if(!in_array($val, ['admin', 'mod'])) {
			return $this;
		}
		$this->log->access_level = $val;
		return $this;
	}

	public function save($res = false)
	{
		$log = $this->log;
		if(!isset($log->user)) {
			throw new \Exception('Invalid ModLog attribute.');
		}

		$ml = new ModLog();
		$ml->user_id = $log->user->id;
		$ml->user_username = $log->user->username;
		$ml->object_uid = $log->object_uid ?? null;
		$ml->object_id = $log->object_id ?? null;
		$ml->object_type = $log->object_type ?? null;
		$ml->action = $log->action ?? null;
		$ml->message = $log->message ?? null;
		$ml->metadata = $log->metadata ?? null;
		$ml->access_level = $log->access_level ?? 'admin';
		$ml->save();

		if($res == true) {
			return $ml;
		} else {
			return;
		}
	}

	public function load($modLog)
	{
		$this->log = $modLog;
		return $this;
	}

	public function fanout()
	{
		$log = $this->log;

		$item_id = $log->id;
		$item_type = 'App\ModLog';
		$action = 'admin.user.modlog.comment';

		$admins = User::whereNull('status')
			->whereNotIn('id', [$log->user_id])
			->whereIsAdmin(true)
			->pluck('profile_id')
			->toArray();

		foreach($admins as $user) {
			$n = new Notification;
			$n->profile_id = $user;
			$n->actor_id = $log->admin->profile_id;
			$n->item_id = $item_id;
			$n->item_type = $item_type;
			$n->action = $action;
			$n->save();
		}
	}

	public function unfanout()
	{
		Notification::whereItemType('App\ModLog')
			->whereItemId($this->log->id)
			->delete();
	}
}