<?php

namespace App\Http\Controllers\Mitigation;

use App\Models\WebhookMessage;
use App\Models\WebhookUsageType;
use App\Rules\AdminAnyPrefixIdentity;
use App\Rules\Fragments\PagedTable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class AdminAttackController extends AttackController
{
    protected $admin = true;

    public function __construct()
    {
        parent::__construct();
    }

    protected function scope(Request $_r)
    {
        return $_r->input('organisation_id');
    }

    protected function prefix_rule()
    {
        return new AdminAnyPrefixIdentity;
    }

    public function fetch_notifications(Request $_r) {
        return $this->paged_table($_r, function() {
            return WebhookMessage::leftJoin('webhooks', 'webhook_id', '=', 'webhooks.id')
                ->join('organisations', 'organisations.id', '=', 'webhook_messages.organisation_id')
                ->where('message_type', '=', WebhookUsageType::Mitigation->value)
                ->select(
                    'webhook_messages.created_at as queued_at',
                    'sent_at',
                    'webhook_messages.id as message_id',
                    'status',
                    'payload as message',
                    'hook_type',
                    'webhooks.name as hook_name',
                    'webhook_messages.organisation_id as organisation_id',
                    'organisations.name as organisation_name'
                );
        }, [
            'queued_at'         => [ 'db' => 'webhook_messages.created_at', 'searchable' => true ],
            'sent_at'           => [ 'db' => 'sent_at', 'searchable' => true ],
            'message_id'        => [ 'db' => 'webhook_messages.id', 'searchable' => true ],
            'message'           => [ 'db' => DB::raw('payload::text'), 'searchable' => true ],
            'hook_type'         => [ 'db' => DB::raw('hook_type::text'), 'searchable' => true ],
            'hook_name'         => [ 'db' => 'webhooks.name', 'searchable' => true ],
            'organisation_name' => [ 'db' => 'organisations.name', 'searchable' => true ],
        ], 'webhook_messages.created_at', null);
    }

    public function fetch_leaderboard(Request $_r) {

        $valid_request = !Validator::make($_r->all(), [
            ...PagedTable::rules([
                'organisation', 'events', 'c_score',
                'max_peak_gbps', 'max_peak_mpps', 'avg_peak_gbps', 'avg_peak_mpps',
                'median_peak_gbps', 'median_peak_mpps', 'sum_gbps', 'sum_mpps',
                'mean_duration', 'median_duration'
            ]),
            'attack_start' => ['required', 'date'],
            'attack_finish' => ['required', 'date'],
            'attack_size' => ['required', 'integer'],
        ])->fails();

        if(!$valid_request) {
            return response()->json(['detail' => __('api.422_INVALID_PAYLOAD')], 422);
        }

        $this->log_event(static::class . '::fetch_leaderboard', $_r->input());

        try {
            return response()->json($this->oculi->get_leaderboard(
                $_r->input('draw'),
                $_r->input('attack_start'),
                $_r->input('attack_finish'),
                $_r->input('attack_size'),
                $_r->input('start'),
                $_r->input('length'),
                $_r->input('order_column'),
                $_r->input('order_direction')
            ), 200);
        } catch(\Throwable $ex) {
            $this->log_error(static::class . '::fetch_leaderboard', $_r->input(), $ex);
        }

        return response()->json([
            'draw' => 0,
            'recordsTotal' => 0,
            'recordsFiltered' => 0,
            'data' => []
        ], 200);
    }
}
