<?php

namespace App\Helpers\Utility;

use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use App\Models\Goliath\GoliathAttack;
use App\Models\Goliath\GoliathAttackPrefix;

class GoliathAttacks {
    public static function calculate($_addr_id, $_addr_cidr) {
        try {
            GoliathAttack::select('id')
                ->where('created_at', '>', Carbon::now()->subDays(14))
                ->where(function($x) use($_addr_cidr) {
                    $x->where(DB::raw("CONCAT(goliath_attacks.destination,'/32')::cidr"), '<<', $_addr_cidr)->orWhere(DB::raw("CONCAT(goliath_attacks.destination,'/32')::cidr"), '=', $_addr_cidr);
                })
                ->chunk(config('creatia.constant.chunk_small'), function($attacks) use($_addr_id) {

                    $to_insert = [];

                    $known_association_lookup = GoliathAttackPrefix::leftJoin('goliath_attacks', 'attack_id', '=', 'goliath_attacks.id')
                        ->whereIn('attack_id', $attacks->pluck('id'))
                        ->select(DB::raw('CONCAT(prefix_id, \'-\', attack_id) AS lookup_id'))
                        ->get()
                        ->keyBy('lookup_id');

                    foreach($attacks as $attack) {
                        if(!isset($known_association_lookup["$_addr_id-$attack->id"])) {
                            $to_insert[] = [
                                'prefix_id' => $_addr_id,
                                'attack_id' => $attack->id
                            ];
                        }
                    }

                    foreach(array_chunk($to_insert, config('creatia.constant.chunk_small')) as $chunk) {
                        DB::table('goliath_attack_prefixes')->insert($chunk);
                    }
                });
        }
        catch(\Exception $ex) {
            \Log::debug($ex);
        }
    }

}

?>