<?php

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

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

class Network {
    
    public static function routes() {

        static::user_view();
        static::user_subtenant();
        static::user_delete();
        static::user_rename();
        static::user_map();
        static::user_reroute();

        static::admin_write();
    }

    public static function user_reroute() {

        Route::group(['middleware' => ['auth:api', 'bounce:network.redirect-view'], 'prefix' => 'network'], function ($r) {

            // Get a list of reroutes
            Route::get('/reroute', [NetworkController::class, 'list_redirects']);

        });

        Route::group(['middleware' => ['auth:api', 'bounce:network.redirect-write'], 'prefix' => 'network'], function ($r) {
            
            // Options
            Route::get('/reroute/option', [NetworkController::class, 'fetch_redirect_options']);

            // Ping
            Route::get('/reroute/ping', [NetworkController::class, 'fetch_redirect_ping']);

            // Create
            Route::post('/reroute', [NetworkController::class, 'create_redirect']);

            // Remove
            Route::delete('/reroute/{_id}', [NetworkController::class, 'remove_redirect'])->whereNumber('_id');

            // Refresh
            Route::post('/reroute/{_id}', [NetworkController::class, 'refresh_redirect'])->whereNumber('_id');

        });

    }

    public static function user_view() {

        Route::group(['middleware' => ['auth:api'], 'prefix' => 'network'], function ($r) {
            Route::get('/prefix/{_network_id}', [NetworkController::class, 'get_prefix_details'])->whereNumber('_network_id');

            Route::get('/prefix/address', [NetworkController::class, 'get_valid_owned_subnet']);

            Route::get('/prefix', [NetworkController::class, 'check_prefix_conditions']);
        });
    }

    public static function user_subtenant() {
 
        Route::group(['middleware' => ['auth:api', 'bounce:network.subtenant'], 'prefix' => 'network'], function ($r) {
            // Check if you can add the subnet
            Route::get('/prefix/{_network_id}/subtenant', [NetworkController::class, 'get_subtenants']);

            // Check if you can add the subnet
            Route::put('/prefix/{_network_id}/subtenant', [NetworkController::class, 'put_subtenant']);
        });
    }

    public static function user_delete() {
 
        Route::group(['middleware' => ['auth:api', 'bounce:network.delete'], 'prefix' => 'network'], function ($r) {

            // Delete a given prefix
            Route::delete('/prefix/{_prefix_id}', [NetworkController::class, 'delete_prefix']);
                        
        });
    }

    public static function user_rename() {
 
        Route::group(['middleware' => ['auth:api', 'bounce:network.rename'], 'prefix' => 'network'], function ($r) {
            
            Route::patch('/prefix/{_prefix_id}/data', [NetworkController::class, 'rename_prefix']);
        
        });
    }

    public static function user_map() {
 
        Route::group(['middleware' => ['auth:api', 'bounce:network.map'], 'prefix' => 'network'], function ($r) {
            
            Route::get('/community/{_category}', [NetworkController::class, 'list_communities']);

        });
    }

    public static function admin_read() {
        
    }

    public static function admin_write() {

        Route::group(['middleware' => ['auth:api','bounce:management.view,management.write'], 'prefix' => "admin/network"], function ($router) {
            // Get prefix automation exclusion list
            Route::get('/asn/{_asn_id}/exclusion', [AdminNetworkController::class, 'get_exclusions']);
            Route::get('/asn/{_asn_id}/inclusion', [AdminNetworkController::class, 'get_inclusions']);
        
            // Change prefix automation inclusion list
            Route::put('/asn/{_asn_id}/exclusion', [AdminNetworkController::class, 'put_exclusions']);
            Route::put('/asn/{_asn_id}/inclusion', [AdminNetworkController::class, 'put_inclusions']);

            // Delete a given prefix
            Route::delete('/prefix/{_prefix_id}', [AdminNetworkController::class, 'delete_prefix']);

            // Rename a given prefix
            Route::patch('/prefix/{_prefix_id}/data', [AdminNetworkController::class, 'rename_prefix']);

            // Get prefix details
            Route::get('/prefix/{_network_id}', [AdminNetworkController::class, 'get_prefix_details'])->whereNumber('_network_id');
        });
    }
    
}
