<?php

namespace App\Services;

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();
    }
}
