<?php

use App\Modules\Network\Controllers\NetworkController;
use App\Modules\Network\Controllers\AdminNetworkController;

use App\Modules\Network\Controllers\AdminGeoIpController;
use App\Modules\Network\Controllers\GeoIpController;

use App\Modules\Network\Controllers\MercuryController;
use App\Modules\Network\Controllers\AdminMercuryController;

use Illuminate\Support\Facades\Route;

use App\Modules\Network\GoliathRoutes;

/* URI SLUGS */
$admin_slug         = 'admin';
$geoip_slug         = 'locus';
$firewall_slug      = 'firewall';
$mercury_slug       = 'mercury';

GoliathRoutes::register();

/* MERCURY SPECIFIC ROUTES */

Route::group(['middleware' => ['auth:api','bounce:mercury.view'], 'prefix' => $mercury_slug], function ($router) {
    Route::get('/option', [MercuryController::class, 'fetch_appliance_options']);
    Route::get('/tunnel', [MercuryController::class, 'fetch_tunnel_list']);
    Route::get('/tunnel/{_tunnel_id}', [MercuryController::class, 'get_tunnel']);

    Route::post('/tunnel', [MercuryController::class, 'create_tunnel']);
    Route::patch('/tunnel/{_tunnel_id}', [MercuryController::class, 'edit_tunnel']);
    Route::delete('/tunnel/{_tunnel_id}', [MercuryController::class, 'delete_tunnel']);

    Route::get('/settings', [MercuryController::class, 'get_announcements']);
    Route::put('/settings', [MercuryController::class, 'put_announcements']);
});

Route::group(['middleware' => ['auth:api','bounce:mercury.view,management.write'], 'prefix' => "$admin_slug/$mercury_slug"], function ($router) {
    Route::get('/attributes/{_organisation_id}', [AdminMercuryController::class, 'get_attributes']);
    Route::put('/attributes/{_organisation_id}', [AdminMercuryController::class, 'put_attributes']);
});

Route::group(['middleware' => ['auth:api','bounce:mercury.manage'], 'prefix' => "$admin_slug/$mercury_slug"], function ($router) {
    Route::get('/appliance', [AdminMercuryController::class, 'fetch_appliance_list']);
    Route::get('/tunnel', [AdminMercuryController::class, 'fetch_tunnel_list']);
});

/* GEOIP SPECIFIC ROUTES */

// GeoIP Viewables Only
Route::group(['middleware' => ['auth:api','bounce:geoip.view'], 'prefix' => $geoip_slug], function ($router) {
    
    // Fetch supernets
    Route::get('/', [GeoIpController::class, 'get_geoips']);
    
    // Fetch subnets
    Route::get('/{_geo_ip_id}/subnets', [GeoIpController::class, 'get_geoips']);
    
    // Get subnet metadata
    Route::get('/{_geo_ip_id}/metadata', [GeoIpController::class, 'get_geoip_metadata']);
    
    // Get metadata
    Route::get('/metadata', [GeoIpController::class, 'get_metadata']);

    // Get Regions
    Route::get('/region', [GeoIpController::class, 'get_regions']);
});

// GeoIP Add Only
Route::group(['middleware' => ['auth:api','bounce:geoip.add'], 'prefix' => $geoip_slug], function ($router) {

    // Check if you can add the subnet
    Route::get('/{_geo_ip_id}/subnets/add', [NetworkController::class, 'get_inside_subnet']);

    // Check if you can add the subnet
    Route::post('/{_geo_ip_id}/subnets/add', [GeoIpController::class, 'post_subnet']);
});

// GeoIP Edit Only
Route::group(['middleware' => ['auth:api','bounce:geoip.edit'], 'prefix' => $geoip_slug], function ($router) {

    // Check if you can add the subnet
    Route::get('/{_geo_ip_id}/data/get', [GeoIpController::class, 'get_data']);

    // Check if you can add the subnet
    Route::put('/{_geo_ip_id}/data/edit', [GeoIpController::class, 'put_data']);
});

// GeoIP Subtenancy Only
Route::group(['middleware' => ['auth:api','bounce:geoip.subtenancy'], 'prefix' => $geoip_slug], function ($router) {

    // Check if you can add the subnet
    Route::get('/{_geo_ip_id}/subtenancy/get', [NetworkController::class, 'get_subtenants']);

    // Check if you can add the subnet
    Route::put('/{_geo_ip_id}/subtenancy/edit', [NetworkController::class, 'put_subtenant']);
});

// GeoIP Management Viewables
Route::group(['middleware' => ['auth:api','bounce:geoip.management,management.view'], 'prefix' => "$admin_slug/$geoip_slug"], function ($router) {

    // Fetch supernets
    Route::get('/', [AdminGeoIpController::class, 'get_geoips']);

    // Get metadata
    Route::get('/metadata/{_organisation_id}', [AdminGeoIpController::class, 'get_metadata']);

    // Get prefix metadata
    Route::get('/{_prefix_id}/metadata', [AdminNetworkController::class, 'get_prefix_metadata']);

    // Get history
    Route::get('/{_geo_ip_id}/history', [AdminGeoIpController::class, 'get_history']);
});

// GeoIP Management Writables
Route::group(['middleware' => ['auth:api','bounce:geoip.management,management.write'], 'prefix' => "$admin_slug/$geoip_slug"], function ($router) {
    // Get data
    Route::get('/{_geo_ip_id}/data/get', [AdminGeoIpController::class, 'get_data']);

    // Edit data
    Route::put('/{_geo_ip_id}/data/edit', [AdminGeoIpController::class, 'put_data']);

    // Edit metadata
    Route::put('/metadata/{_organisation_id}', [AdminGeoIpController::class, 'put_metadata']);
});

/* NETWORK ADMIN SPECIFIC ROUTES */
Route::group(['middleware' => ['auth:api','bounce:management.view,management.write'], 'prefix' => "$admin_slug"], function ($router) {
    Route::get('/asn/{_asn_id}/exclusion', [AdminNetworkController::class, 'get_exclusions']);
    Route::get('/asn/{_asn_id}/inclusion', [AdminNetworkController::class, 'get_inclusions']);


    Route::put('/asn/{_asn_id}/exclusion', [AdminNetworkController::class, 'put_exclusions']);
    Route::put('/asn/{_asn_id}/inclusion', [AdminNetworkController::class, 'put_inclusions']);
});

/* Allow subtenancy for prefixes */
Route::group(['middleware' => ['auth:api','bounce:network.subtenant']], function ($router) {
    // Check if you can add the subnet
    Route::get('/{_network_id}/subtenancy', [NetworkController::class, 'get_subtenants']);

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

/* Allow for prefix deletion */
Route::delete('/{_prefix_id}', [NetworkController::class, 'delete_prefix'])->middleware(['auth:api', 'bounce:network.delete']);
Route::delete("$admin_slug/{_prefix_id}", [AdminNetworkController::class, 'delete_prefix'])->middleware(['auth:api', 'bounce:network.delete,management.write']);

/* Allow for prefix renaming */
Route::put('/{_prefix_id}/name', [NetworkController::class, 'rename_prefix'])->middleware(['auth:api', 'bounce:network.rename']);
Route::put("$admin_slug/{_prefix_id}/name", [AdminNetworkController::class, 'rename_prefix'])->middleware(['auth:api', 'bounce:network.rename,management.write']);

/* Allow communities */
Route::get('community/{_category}', [NetworkController::class, 'list_communities'])->middleware(['auth:api', 'bounce:network.map']);