<?php

// Laravel

use App\Http\Controllers\Provisioning\AdminBgpController;
use App\Http\Controllers\Provisioning\AdminComputeController;
use Illuminate\Support\Facades\Route;

// Creatia
use App\Http\Controllers\Provisioning\BgpController;
use App\Http\Controllers\Provisioning\ComputeController;
use App\Http\Controllers\Provisioning\TransitController;

class Provisioning {
    
    public static function routes() {
        static::user_view();
        static::admin_view();
    }

    /*
     * User Specific Routes
     */
    
    private static function user_view() {

        /**
         * Legacy Transit Provisioning
         */

        Route::group(['middleware' => ['auth:api', "bounce:provision.bgp.view"], 'prefix' => 'provisioning'], function ($r) {

            // Interface list
            Route::get('bgp', [BgpController::class, 'get_sid_list']);

            // Extra details
            Route::get('bgp/{_id}', [BgpController::class, 'get_sid_details']);

            // Peering
            Route::get('peering', [BgpController::class, 'get_asn_details']);
            
        });

        Route::group(['middleware' => ['auth:api', "bounce:provision.bgp.write"], 'prefix' => 'provisioning'], function ($r) {

            // Session
            Route::post('session', [BgpController::class, 'post_bgp_session']);
            
        });

        /**
         * Current Transit Provisioning
         */

        Route::group(['middleware' => ['auth:api', "bounce:transit.bgp.read"], 'prefix' => 'transit'], function ($r) {

            Route::get('port', [TransitController::class, 'get_port_list']);

            Route::get('port/{_id}', [TransitController::class, 'get_port_details']);

            Route::get('port/{_id}/config', [TransitController::class, 'get_port_config']);

            Route::get('port/{_id}/tag/{_code}', [TransitController::class, 'get_tag']);

            Route::get('peering', [TransitController::class, 'get_asn_details']);

            Route::get('job', [TransitController::class, 'get_existing_jobs']);

            // The job key is now an opaque 128-hex hash - nothing else reaches the client.
            Route::get('job/{_key}', [TransitController::class, 'get_job'])->where('_key', '[a-f0-9]{128}');

        });

        Route::group(['middleware' => ['auth:api', "bounce:transit.bgp.write"], 'prefix' => 'transit'], function ($r) {

            Route::post('session', [TransitController::class, 'add_bgp_session']);

            Route::post('bgp/{_id}/bfd', [TransitController::class, 'update_bfd']);

            Route::post('bgp/{_id}/null', [TransitController::class, 'update_bgp_null']);

            Route::post('bgp/{_id}/password', [TransitController::class, 'update_password']);

            // Session lifecycle (async job queue)
            Route::post('bgp/{_id}/policy', [TransitController::class, 'update_policy']);

            Route::post('bgp/{_id}/limit', [TransitController::class, 'refresh_limit']);

            Route::post('bgp/{_id}/delete', [TransitController::class, 'delete_session']);

            // Port configuration
            Route::post('port/{_id}/userdescription', [TransitController::class, 'set_user_description']);

            Route::post('port/{_id}/lplimit', [TransitController::class, 'update_lp_limit']);

            Route::post('port/{_id}/lag/member', [TransitController::class, 'update_lag_member']);

            Route::post('port/{_id}/lag/create', [TransitController::class, 'create_lag']);

            // Ethernet / MEF
            Route::post('port/{_id}/tag', [TransitController::class, 'create_tag']);

            Route::post('port/{_id}/evc', [TransitController::class, 'create_evc']);

            Route::post('port/{_id}/evc/{_evc}/delete', [TransitController::class, 'delete_evc']);

        });

        /**
         * Dedicated Server BGP Provisioning
         */

        Route::group(['middleware' => ['auth:api', "bounce:compute.bgp.view"], 'prefix' => 'compute'], function ($r) {

            // List of peers
            Route::get('peer', [ComputeController::class, 'get_peers']);

            // List of peers
            Route::get('options', [ComputeController::class, 'get_options']);
            
        });

        Route::group(['middleware' => ['auth:api', "bounce:compute.bgp.write"], 'prefix' => 'compute'], function ($r) {

            // Session
            Route::post('peer', [ComputeController::class, 'add_peer']);
            
        });

        Route::group(['middleware' => ['auth:api', "bounce:compute.bgp.delete"], 'prefix' => 'compute'], function ($r) {

            // Session
            Route::delete('peer/{_peer_id}', [ComputeController::class, 'delete_session']);
            
        });

    }

    /*
     * Admin Specific Routes
     */
    
    private static function admin_view() {
        Route::group(['middleware' => ['auth:api', "bounce:provision.bgp.view,management.view"], 'prefix' => 'admin/provisioning'], function ($r) {

            // Interface list
            Route::get('bgp/{_type}/{_identifier}', [AdminBgpController::class, 'get_full_sid_list']);

            // Extra details
            Route::get('bgp/{_id}', [AdminBgpController::class, 'get_sid_details']);

            // Peering
            Route::get('peering', [AdminBgpController::class, 'get_asn_details']);

            // Options
            Route::get('option', [AdminBgpController::class, 'get_options']);
            
        });

        Route::group(['middleware' => ['auth:api', "bounce:provision.bgp.write,management.write"], 'prefix' => 'admin/provisioning'], function ($r) {

            // Session
            Route::post('session', [AdminBgpController::class, 'post_bgp_session']);
            
        });

        Route::group(['middleware' => ['auth:api', "bounce:compute.bgp.view,management.view"], 'prefix' => 'admin/compute'], function ($r) {

            // List of peers
            Route::get('peer', [AdminComputeController::class, 'get_peers']);

            // List of peers
            Route::get('options', [AdminComputeController::class, 'get_options']);
            
        });

        Route::group(['middleware' => ['auth:api', "bounce:compute.bgp.write,management.write"], 'prefix' => 'admin/compute'], function ($r) {

            // Session
            Route::post('peer', [AdminComputeController::class, 'add_peer']);
            
        });

        Route::group(['middleware' => ['auth:api', "bounce:compute.bgp.delete,management.write"], 'prefix' => 'admin/compute'], function ($r) {

            // Session
            Route::delete('peer/{_peer_id}', [AdminComputeController::class, 'delete_session']);
            
        });

    }

}
