<?php

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

use App\Modules\Network\Controllers\AdminMitigationController;
use App\Modules\Network\Controllers\MitigationController;

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

use Illuminate\Support\Facades\Route;

/* URI SLUGS */
$admin_slug         = 'admin';
$mitigation_slug    = 'mitigation';
$geoip_slug         = 'locus';
$firewall_slug      = 'firewall';

/* MITIGATION SPECIFIC ROUTES */

// Mitigation Viewables Only
Route::group(['middleware' => ['auth:api','bounce:mitigation.view'], 'prefix' => $mitigation_slug], function ($router) {
    
    // Fetch supernets
    Route::get('/', [MitigationController::class, 'get_networks']);
    
    // Fetch subnets
    Route::get('/{_network_id}/subnets', [MitigationController::class, 'get_networks']);
    
    // Get subnet metadata
    Route::get('/{_network_id}/metadata', [MitigationController::class, 'get_subnet_metadata']);
    
    // Get metadata
    Route::get('/metadata', [MitigationController::class, 'get_metadata']);
});

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

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

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

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

    // Check if you can add the subnet
    Route::get('/{_network_id}/profile/get', [MitigationController::class, 'get_mitigation']);

    // Check if you can add the subnet
    Route::put('/{_network_id}/profile/edit', [MitigationController::class, 'put_mitigation']);
});

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

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

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

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

    // Fetch supernets
    Route::get('/', [AdminMitigationController::class, 'get_networks']);

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

    // Download CSV
    Route::get('/download-csv-zip', [AdminMitigationController::class, 'get_corero_csvs_zipped']);     
});

// Mitigation Management Writables
Route::group(['middleware' => ['auth:api','bounce:mitigation.management,management.write'], 'prefix' => "$admin_slug/$mitigation_slug"], function ($router) {
    // Check if you can add the subnet
    Route::get('/{_network_id}/subnets/add', [AdminMitigationController::class, 'get_inside_subnet']);

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

    // Check if you can add the subnet
    Route::get('/{_network_id}/profile/get', [AdminMitigationController::class, 'get_mitigation']);

    // Check if you can add the subnet
    Route::put('/{_network_id}/profile/edit', [AdminMitigationController::class, 'put_mitigation']);

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

/* 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']);
});

// 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']);
});

