<?php

use App\Http\Controllers\Auth\AuthController;
use App\Http\Controllers\Auth\TokenController;

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 Illuminate\Support\Facades\Route;

/*
 * Authentication mechanisms - Not available to the authenticated, obviously.
 */
Route::group(['middleware' => 'api'], function ($router) {
    // Login
    Route::post('auth/login', [AuthController::class, 'login'])->name('login');

    // Request Reset
    Route::post('auth/reset-password', [AuthController::class, 'reset'])->name('password-reset');
    
    // Token Refreshing
    Route::get('auth/refresh', [AuthController::class, 'refresh'])->name('refresh');

    // Validate Tokens
    Route::get('auth/{_type}/{_token}', [TokenController::class, 'check'])->name('check');

    // Setup Password
    Route::post('auth/setup/{_token}', [TokenController::class, 'setup'])->name('setup');

    // Reset Password
    Route::post('auth/reset/{_token}', [TokenController::class, 'reset'])->name('reset');
});

/**
 * Authenticated routes only.
 */

// Retrieve information about the end user
Route::get('auth/logout', [AuthController::class, 'logout'])->name('logout')->middleware('auth:api');
Route::get('auth/me', [AuthController::class, 'me'])->name('me')->middleware('auth:api');

// Management view operations
Route::group(['middleware' => ['auth:api','bounce:management.view']], function ($router) {
    
    // Organisation
    Route::get('admin/organisation/no-parent-list', [OrganisationAdminController::class, 'get_parentless_organisation'])->name('get_parentless_organisation');

    Route::get('admin/organisation', [OrganisationAdminController::class, 'get_organisations'])->name('get_organisations');
    Route::get('admin/organisation/{organisation_id}/user', [OrganisationAdminController::class, 'get_users'])->name('get_users');
    Route::get('admin/organisation/{organisation_id}/sub', [OrganisationAdminController::class, 'get_suborganisations'])->name('get_suborganisations');
    Route::get('admin/organisation/{organisation_id}/asn', [OrganisationAdminController::class, 'get_asns'])->name('get_asns');

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

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

});

// Management change operations
Route::group(['middleware' => ['auth:api','bounce:management.write']], function ($router) {

    // Organisation
    Route::post('admin/organisation/add', [OrganisationAdminController::class, 'post_organisation'])->name('post_organisation');
    Route::post('admin/organisation/{organisation_id}/user/add', [OrganisationAdminController::class, 'post_user'])->name('post_user');

    Route::post('admin/organisation/{organisation_id}/sub/add/new', [OrganisationAdminController::class, 'post_new_suborganisation'])->name('post_new_suborganisation');
    Route::post('admin/organisation/{organisation_id}/sub/add/existing', [OrganisationAdminController::class, 'post_existing_suborganisation'])->name('post_existing_suborganisation');

    Route::post('admin/organisation/{organisation_id}/asn/add', [OrganisationAdminController::class, 'post_asn'])->name('post_asn');

    // User
    Route::put('admin/user', [UserAdminController::class, 'put_user'])->name('add_user');
    Route::put('admin/user/{_user_id}', [UserAdminController::class, 'put_user'])->name('edit_user');

    // Group
    Route::put('admin/group', [GroupAdminController::class, 'put_group'])->name('add_group');
    Route::put('admin/group/{_group_id}', [GroupAdminController::class, 'put_group'])->name('edit_group');

});