<?php

// Laravel
use Illuminate\Support\Facades\Route;

// Creatia
use App\Http\Controllers\Network\AdminNetworkController;
use App\Http\Controllers\Network\NetworkController;

use App\Http\Controllers\Goliath\AdminGoliathController;
use App\Http\Controllers\Goliath\GoliathController;

class GoliathLevel1 {
    
    public static function routes() {
        static::user_view();
        static::user_edit();
        static::user_log();
        static::user_chart();
        static::user_special();

        static::admin_view();
        static::admin_edit();
        static::admin_log();
        static::admin_chart();
        static::admin_special();
    }

    /*
     * User Specific Routes
     */
    
    private static function user_view() {
        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.view"], 'prefix' => 'goliath'], function ($r) {
    
            // Get flags for editing 
            Route::get('/prefix/{_prefix_id}/flag', [GoliathController::class, 'get_flags']);

            // View subnets in a supernet
            Route::get('/prefix/{_network_id}', [GoliathController::class, 'get_prefix_list'])->name('goliath-user-view-list-subs');
            
            // View all prefixes
            Route::get('/prefix', [GoliathController::class, 'get_prefix_list'])->name('goliath-user-view-list-all');
            
            // List of prefixes as a series of options
            Route::get('/prefix/options', [NetworkController::class, 'get_prefix_options'])->name('goliath-user-view-list-options');
        
        });
    }

    private static function user_edit() {
        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.edit"], 'prefix' => 'goliath'], function ($r) {
            
            // Check whether the subnet can be added
            Route::get('/prefix/{_network_id}/subnet', [GoliathController::class, 'get_inside_subnet']);
            
            // Add subnet
            Route::post('/prefix/{_network_id}/subnet', [GoliathController::class, 'post_subnet']);
            
            // Edit flags
            Route::put('/prefix/{_prefix_id}/flag', [GoliathController::class, 'put_flags']);
            
            // Get set defaults for an ASN
            Route::get('/prefix/default/{_asn_id}', [GoliathController::class, 'get_defaults']);
    
            // Set defaults for an ASN
            Route::put('/prefix/default/{_asn_id}', [GoliathController::class, 'put_defaults']); 
            
        });

        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.bulk-edit"], 'prefix' => 'goliath'], function ($r) {
            
            // Set defaults for a prefix
            Route::put('/prefix/{_network_id}/bulk', [GoliathController::class, 'bulk_update_flags']); 
        
        });
    }

    private static function user_special() {
        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.special"], 'prefix' => 'goliath'], function ($r) {
            
            // Get special status for goliath
            Route::get('/special', [GoliathController::class, 'get_special']);
    
            // Set special status for goliath
            Route::put('/special', [GoliathController::class, 'put_special']);
            
            // Get special for prefix 
            Route::get('/prefix/{_prefix_id}/special', [GoliathController::class, 'get_special_prefix']);
            
            // Set special for prefix
            Route::put('/prefix/{_prefix_id}/special', [GoliathController::class, 'put_special_prefix']);
        });
    }

    private static function user_log() {
        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.log"], 'prefix' => 'goliath'], function ($r) {

            // Audit trail for flag changes
            Route::get('/activity/mitigation', [GoliathController::class, 'get_recent_changes']);

            // List of attacks against a customer
            Route::get('/activity/attack', [GoliathController::class, 'get_attack_logs']);

            // List of attacks for prefix
            Route::get('/prefix/{_prefix_id}/attack', [GoliathController::class, 'get_attack_logs']);

            // Summary of attack information
            Route::get('/summary/attack', [GoliathController::class, 'get_attack_summary']);
        });
    }

    private static function user_chart() {

        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.chart"], 'prefix' => 'goliath'], function ($r) {
            
            // Get usage off the bat
            Route::get('/usage', [GoliathController::class, 'get_usage_chart']); 
        });
    }

    /*
     * Admin Specific Routes
     */

    private static function admin_view() {
        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.manage,goliath.l1.view"], 'prefix' => 'admin/goliath'], function ($r) {
            
            // Fetch device option list
            Route::get('/device/options', [AdminGoliathController::class, 'fetch_appliances_options']);

            // Fetch device list
            Route::get('/device', [AdminGoliathController::class, 'fetch_appliance_list']);

            // Fetch device configurations
            Route::get('/device/{_appliance_id}', [AdminGoliathController::class, 'fetch_appliance_configuration']);
    
            // Fetch list of subnets for a supernet
            Route::get('/prefix/{_network_id}', [AdminGoliathController::class, 'get_prefix_list']);

            // Fetch list of prefixes
            Route::get('/prefix', [AdminGoliathController::class, 'get_prefix_list']);

            // View prefixes as options
            Route::get('/prefix/options', [AdminNetworkController::class, 'get_prefix_options']);
        });
    }

    private static function admin_edit() {
        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.manage,goliath.l1.edit"], 'prefix' => 'admin/goliath'], function ($r) {
            
            // Get whether a prefix is inside a given subnet
            Route::get('/prefix/{_network_id}/subnet', [AdminGoliathController::class, 'get_inside_subnet']);  
            
            // Add subnet
            Route::post('/prefix/{_network_id}/subnet', [AdminGoliathController::class, 'post_subnet']);       
    
            // Get flags
            Route::get('/prefix/{_prefix_id}/flag', [AdminGoliathController::class, 'get_flags']);
            
            // Edit flags
            Route::put('/prefix/{_prefix_id}/flag', [AdminGoliathController::class, 'put_flags']);
    
            // Get defaults for an ASN
            Route::get('/prefix/default/{_asn_id}', [AdminGoliathController::class, 'get_defaults']);
            
            // Set defaults for an ASN
            Route::put('/prefix/default/{_asn_id}', [AdminGoliathController::class, 'put_defaults']);

        });

        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.manage,goliath.l1.bulk-edit"], 'prefix' => 'admin/goliath'], function ($r) {
            
            // Set defaults for a prefix
            Route::put('/prefix/{_network_id}/bulk', [AdminGoliathController::class, 'bulk_update_flags']); 
        
        });
    }

    private static function admin_log() {
        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.manage,goliath.l1.log"], 'prefix' => 'admin/goliath'], function ($r) {
            
            // Audit trail for recent flag changes
            Route::get('/activity/mitigation', [AdminGoliathController::class, 'get_recent_changes']);
            
            // List of attacks against a customer
            Route::get('/activity/attack/{_prefix_id?}', [AdminGoliathController::class, 'get_attack_logs']);
            
            // Summary of attack information
            Route::get('/summary/attack', [AdminGoliathController::class, 'get_attack_summary']); 
        });
    }

    private static function admin_chart() {

        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.manage,goliath.l1.chart"], 'prefix' => 'admin/goliath'], function ($r) {
            
            // Usage for ALL ASNs
            Route::get('/usage', [AdminGoliathController::class, 'get_usage_chart']);

        });
    }

    private static function admin_special() {
        Route::group(['middleware' => ['auth:api', "bounce:goliath.l1.manage,goliath.l1.special"], 'prefix' => 'admin/goliath'], function ($r) {
            
            // Get special status for goliath
            Route::get('/special/{_organisation_id}', [AdminGoliathController::class, 'get_special']);
    
            // Set special status for goliath
            Route::put('/special/{_organisation_id}', [AdminGoliathController::class, 'put_special']);
            
            // Get special for prefix 
            Route::get('/prefix/{_prefix_id}/special', [AdminGoliathController::class, 'get_special_prefix']);
            
            // Set special for prefix
            Route::put('/prefix/{_prefix_id}/special', [AdminGoliathController::class, 'put_special_prefix']);
        });
    }

}
