<?php

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

// Creatia
use App\Http\Controllers\Organisation\Controller as OrganisationController;
use App\Http\Controllers\Organisation\AdminController as OrganisationAdminController;
use App\Http\Controllers\User\AdminController as UserAdminController;
use App\Http\Controllers\Permission\AdminController as GroupAdminController;

use App\Http\Controllers\User\Controller as UserController;
use App\Http\Controllers\Permission\Controller as GroupController;

class Organisation {
    public static function routes() {

        // Standard
        static::organisation_standard();

        // Admin
        static::organisation_admin();
        static::user_admin();
        static::group_admin();
    }

    /*
     * - Guest routes are only accessible to non-authed users.
     * - We split up the guest routes and user routes for readability.
     */
    
    private static function organisation_standard() {
        // Readable
        Route::group(['middleware' => ['auth:api', 'bounce'], 'prefix' => 'organisation'], function ($r) {

            // Get ASN list
            Route::get('asn', [OrganisationController::class, 'get_asns'])->name('organisation-standard-asn-list');
            
            // Claim ASN Ownership
            Route::post('asn', [OrganisationController::class, 'post_asn'])->name('organisation-standard-asn-claim');

            // Check ASN information
            Route::get('asn/{_asn_id}/peer', [OrganisationController::class, 'get_peering'])->whereNumber('_asn_id')->name('organisation-standard-asn-peer-information');

            // Get email for ASN Ownership
            Route::get('asn/email', [OrganisationController::class, 'list_asn_emails'])->name('organisation-standard-asn-email');

            // Prove ASN Ownership
            Route::post('asn/approval', [OrganisationController::class, 'approve_asn'])->name('organisation-standard-asn-approval');

            // Get AS-SET list
            Route::get('asset', [OrganisationController::class, 'get_as_set'])->name('organisation-standard-as-set-list');

            // Claim AS-SET Ownership
            Route::post('asset', [OrganisationController::class, 'post_as_set'])->name('organisation-standard-as-set-claim');
            
            // Prove AS-SET Ownership
            Route::post('asset/approval', [OrganisationController::class, 'approve_as_set'])->name('organisation-standard-as-set-approval');
            
        });

        // Writable
        Route::group(['middleware' => ['auth:api', 'bounce:organisation.manage'], 'prefix' => 'user'], function ($r) {

            // List of users
            Route::get('', [UserController::class, 'get_users'])->name('organisation-standard-user-list');

            // Create new user
            Route::post('', [UserController::class, 'create_user'])->name('user-standard-create');

            // Edit an existing user
            Route::put('{_user_id}', [UserController::class, 'update_user'])->name('user-standard-edit');

            // Delete an existing user
            Route::delete('{_user_id}', [UserController::class, 'delete_user'])->name('user-standard-delete');

            // Reset an existing user's MFA enrollment
            Route::delete('{_user_id}/mfa', [UserController::class, 'reset_user_mfa'])->name('user-standard-mfa-reset');

        });
    }

    private static function organisation_admin() {
        // Viewable
        Route::group(['middleware' => ['auth:api', 'bounce:management.view'], 'prefix' => 'admin/organisation'], function ($r) {
            
            // List of full parent organisations
            Route::get('parent', [OrganisationAdminController::class, 'get_parentless_organisation'])->name('organisation-admin-list-parent');

            // List of all organisations
            Route::get('', [OrganisationAdminController::class, 'get_organisations'])->name('organisation-admin-list');

            // List of all organisations
            Route::get('{organisation_id}', [OrganisationAdminController::class, 'get_organisation'])->name('organisation-admin-stats');

            // Organisation users
            Route::get('{organisation_id}/user', [OrganisationAdminController::class, 'get_users'])->name('organisation-admin-user-list');

            // Suborganisations
            Route::get('{organisation_id}/child', [OrganisationAdminController::class, 'get_suborganisations'])->name('organisation-admin-child-list');

            // ASNs
            Route::get('{organisation_id}/asn', [OrganisationAdminController::class, 'get_asns'])->name('organisation-admin-asn-list');

            // Get AS-SET list
            Route::get('{_organisation_id}/asset', [OrganisationAdminController::class, 'get_as_set'])->name('organisation-admin-as-set-list')->whereNumber('_organisation_id');
        
            // External identities
            Route::get('{organisation_id}/external', [OrganisationAdminController::class, 'get_external_attributes'])->name('organisation-admin-external-attributes');

            // Rights
            Route::get('{organisation_id}/right', [OrganisationAdminController::class, 'get_rights'])->name('organisation-admin-product-rights');

        });

        // Writeable
        Route::group(['middleware' => ['auth:api', 'bounce:management.write'], 'prefix' => 'admin/organisation'], function ($r) {
            
            // New organisation
            Route::post('', [OrganisationAdminController::class, 'post_organisation'])->name('organisation-admin-create');
        
            // New child organisation
            Route::post('{organisation_id}/child', [OrganisationAdminController::class, 'post_organisation'])->name('organisation-admin-create-child');
            
            // Existing organisation becomes child
            Route::patch('{organisation_id}/child', [OrganisationAdminController::class, 'post_existing_suborganisation'])->name('organisation-admin-associate-child');
        
            // Associate ASN
            Route::post('{organisation_id}/asn', [OrganisationAdminController::class, 'post_asn'])->name('organisation-admin-create-asn');

            // Delete ASN
            Route::delete('asn/{_asn_id}', [OrganisationAdminController::class, 'delete_asn'])->name('organisation-admin-delete-asn')->whereNumber('_asn_id');

            // Associate AS-SET
            Route::post('{_organisation_id}/asset', [OrganisationAdminController::class, 'post_as_set'])->name('organisation-admin-as-set-claim')->whereNumber('_organisation_id');

            // Delete AS-SET
            Route::delete('asset/{_as_set_id}', [OrganisationAdminController::class, 'delete_as_set'])->name('organisation-admin-delete-as-set')->whereNumber('_as_set_id');
        
            // Delete organisation
            Route::delete('{_organisation_id}', [OrganisationAdminController::class, 'delete_organisation'])->name('organisation-admin-delete');
        
            // Setup an external identity
            Route::post('{_organisation_id}/external', [OrganisationAdminController::class, 'post_external_identity'])->name('organisation-admin-external-add')->whereNumber('_organisation_id');

            // Rights
            Route::post('{organisation_id}/right', [OrganisationAdminController::class, 'put_rights'])->name('organisation-admin-put-product-rights');
        
        });

    }

    private static function user_admin() {
        Route::group(['middleware' => ['auth:api', 'bounce:management.view'], 'prefix' => 'admin/user'], function ($r) {

            Route::get('', [UserAdminController::class, 'get_users'])->name('user-admin-list');
            Route::get('{_user_id}', [UserAdminController::class, 'get_user'])->name('user-admin-fetch');
        
        });

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

            Route::post('', [UserAdminController::class, 'create_user'])->name('user-admin-create');
            Route::put('{_user_id}', [UserAdminController::class, 'update_user'])->name('user-admin-edit');

            // Delete an existing user
            Route::delete('{_user_id}', [UserAdminController::class, 'delete_user'])->name('organisation-admin-user-delete');

            // Reset an existing user's MFA enrollment
            Route::delete('{_user_id}/mfa', [UserAdminController::class, 'reset_user_mfa'])->name('user-admin-mfa-reset');

        });
    }

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

            Route::get('{_group_id}', [GroupAdminController::class, 'get_group'])->name('admin-group-fetch');
            Route::get('', [GroupAdminController::class, 'get_groups'])->name('admin-group-list');

        });

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

            Route::post('', [GroupAdminController::class, 'put_group'])->name('admin-group-create');
            Route::patch('{_group_id}', [GroupAdminController::class, 'put_group'])->name('admin-group-edit');
        
        });
    }

}
