<?php

use Leenooks\Controllers\SwitchUserController;
use App\Http\Controllers\{AdminController,
	Auth\LoginController,
	Auth\SocialLoginController,
	CheckoutController,
	HomeController,
	InvoiceController,
	MediaController,
	OrderController,
	PaypalController,
	ProductController,
	SearchController,
	ServiceController,
	SupplierController,
	UserController,
	WelcomeController,
	Wholesale\ReportController};
use App\Models\Supplier;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

// Default Setup
Auth::routes([
	'login'    => true,
	'logout'   => true,
	'register' => false,
	'reset'    => true,   // for resetting passwords
	'confirm'  => false,  // for additional password confirmations
	'verify'   => false,  // for email verification
]);
Route::get('logout',[LoginController::class,'logout'])
	->name('logout-get');

// Account linking to OPENID host
Route::group(['middleware'=>['theme:adminlte-be']],function() {
	Route::get('auth/{socialProvider}',[SocialLoginController::class,'redirectToProvider']);
	Route::get('auth/{socialProvider}/callback',[SocialLoginController::class,'handleProviderCallback']);
	Route::get('auth/{socialProvider}/token',[SocialLoginController::class,'handleBearerTokenCallback']);
	Route::get('auth/{socialProvider}/link',[SocialLoginController::class,'link']);
	Route::post('auth/{socialProvider}/linkcomplete',[SocialLoginController::class,'linkcomplete']);
});

// Return from user switch
Route::get('admin/switch/stop',[SwitchUserController::class,'switch_stop'])
	->middleware('auth')
	->name('switch.stop');

// Generic Image Renderer - Render images that we dont have with a generic image
Route::get('image/generic/{width}/{height}/{color}/{name?}',[MediaController::class,'image'])
	->name('image');

// Our Admin Routes - for wholesalers
Route::group(['middleware'=>['theme:adminlte-be','auth','role:wholesaler'],'prefix'=>'a'],function() {
	// Site Setup
	Route::match(['get','post'],'setup',[AdminController::class,'setup']);

	// Checkout Setup (Payments)
	Route::get('checkout',[CheckoutController::class,'home']);
	Route::get('checkout/{o?}',[CheckoutController::class,'view'])
		->where('o','[0-9]+');
	Route::post('checkout/{o?}',[CheckoutController::class,'addedit'])
		->where('o','[0-9]+');

	// Product Setup
	Route::match(['get'],'product',[ProductController::class,'home']);
	Route::get('product/details/{o?}',[ProductController::class,'details'])
		->where('o','[0-9]+');
	Route::post('product/details/{o?}',[ProductController::class,'details_addedit'])
		->where('o','[0-9]+');

	// Supplier Setup
	Route::get('supplier',[SupplierController::class,'admin_home']);
	Route::get('supplier/cost/new/{o}',[SupplierController::class,'cost_add']);
	Route::post('supplier/cost/new/{o}',[SupplierController::class,'cost_submit']);
	Route::get('supplier/cost/{o}',[SupplierController::class,'cost'])
		->where('o','[0-9]+');
	Route::get('supplier/details/{o?}',[SupplierController::class,'view'])
		->where('o','[0-9]+');
	Route::post('supplier/details/{o?}',[SupplierController::class,'addedit'])
		->where('o','[0-9]+');
	Route::get('supplier/product/add',[SupplierController::class,'product_add']);
	Route::get('supplier/product/addedit/{o}/{oo}/{type}',[SupplierController::class,'product_view'])
		->where('o','[0-9]+')
		->where('oo','[0-9]+')
		->whereIn('type',Supplier::offeringTypeKeys()->toArray());
	Route::post('supplier/product/addedit/{o}/{oo}/{type}',[SupplierController::class,'product_addedit'])
		->where('o','[0-9]+')
		->where('oo','[0-9]+')
		->whereIn('type',Supplier::offeringTypeKeys()->toArray());
	Route::post('supplier/product/view/{type}/{oo?}',[SupplierController::class,'product_view_type'])
		->whereIn('type',Supplier::offeringTypeKeys()->toArray())
		->where('oo','[0-9]+');

	Route::get('report/products',[ReportController::class,'products']);
	// Charges - @todo This should probably go to resellers
	Route::match(['get','post'],'charge/addedit/{o?}',[AdminController::class,'charge_addedit']);
	Route::get('charge/unprocessed',[AdminController::class,'charge_unprocessed']);

	// Payments - @todo This should probably go to resellers
	Route::match(['get','post'],'payment/addedit/{o?}',[AdminController::class,'pay_addedit']);
	Route::get('payment/unapplied',[AdminController::class,'pay_unapplied']);

	// Services
	// @todo This should probably go to resellers - implement a change audit log first
	Route::post('service/update/{o}',[ServiceController::class,'update'])
		->where('o','[0-9]+');

	// Linking supplier to user
	Route::post('user/supplier/add/{o}',[UserController::class,'supplier_addedit'])
		->where('o','[0-9]+');
	Route::get('user/supplier/delete/{o}/{so}',[UserController::class,'supplier_delete'])
		->where('o','[0-9]+')
		->where('so','[0-9]+');

//@deprecated
//	Route::get('service/{o}','AdminHomeController@service');
//	Route::post('service/{o}','AdminHomeController@service_update');
//	Route::get('accounting/connect','AccountingController@connect');
});

// Our Reseller Routes
Route::group(['middleware'=>['theme:adminlte-be','auth','role:reseller'],'prefix'=>'r'],function() {
	// Enable user switch
	Route::get('switch/start/{user}',[SwitchUserController::class,'switch_start'])
		->middleware('can:assume,user')
		->name('switch.start');

	// Reseller Reports
	Route::group(['middleware'=>['theme:adminlte-be','auth','role:reseller'],'prefix'=>'report'],function() {
		Route::get('domain',[ServiceController::class,'domain_list']);
		Route::get('email',[ServiceController::class,'email_list']);
		Route::get('hosting',[ServiceController::class,'hosting_list']);
	});

	// Charges
	Route::get('charges/{o}',[AdminController::class,'charge_pending_account'])
		->middleware('can:view,o')
		->where('o','[0-9]+');

	// Reseller API calls
	Route::post('service_change_charges/{o}',[ServiceController::class,'service_change_charges_display'])
		->where('o','[0-9]+');
});

// Our User Routes
Route::group(['middleware'=>['theme:adminlte-be','auth'],'prefix'=>'u'],function() {
	Route::get('home',[HomeController::class,'home']);
	Route::get('home/{o}',[HomeController::class,'home'])
		->where('o','[0-9]+')
		->middleware('can:view,o');
//	Route::get('account/{o}/invoice','User\AccountController@view_invoice_next')
//		->where('o','[0-9]+')
//		->middleware('can:view,o');
	Route::post('checkout/pay',[CheckoutController::class,'pay']);
	Route::get('invoice/{o}',[InvoiceController::class,'view'])
		->where('o','[0-9]+')
		->middleware('can:view,o');
	Route::get('invoice/{o}/pdf',[InvoiceController::class,'pdf'])
		->where('o','[0-9]+')
		->middleware('can:view,o');
	Route::get('invoice/cart',[CheckoutController::class,'cart_invoice']);
	Route::get('invoice/cart/{o}',[CheckoutController::class,'cart_invoice'])
		->where('o','[0-9]+')
		->middleware('can:view,o');
	Route::get('service/{o}',[ServiceController::class,'home'])
		->where('o','[0-9]+')
		->middleware('can:view,o');
	Route::match(['get','post'],'service/{o}/cancel-request',[ServiceController::class,'cancel_request'])
		->where('o','[0-9]+')
		->middleware('can:progress,o,"cancel-request"');
	Route::match(['get','post'],'service/{o}/change-request',[ServiceController::class,'change_request'])
		->where('o','[0-9]+')
		->middleware('can:progress,o,"change-request"');
	// @todo This shouldnt be a user privilege.
	Route::match(['get','post'],'service/{o}/change-pending',[ServiceController::class,'change_pending'])
		->where('o','[0-9]+')
		->middleware('can:progress,o,"change-pending"');
	Route::get('service/{o}/change/{status}',[ServiceController::class,'change'])
		->where('o','[0-9]+')
		->middleware('can:progress,o,status');
});

// Doorman Code Routes
Route::group(['middleware'=>['theme:adminlte-be'],'prefix'=>'u'],function() {
	Route::get('invoice/{o}/email/{code}',[InvoiceController::class,'view'])
		->where('o','[0-9]+')
		->where('code','[0-9A-Z]{6}');
});

// Frontend Routes (Non-Authed Users)
Route::group(['middleware'=>['theme:metronic-fe']],function() {
	Route::get('/',[WelcomeController::class,'home']);
	Route::get('order',[OrderController::class,'index']);
	Route::post('order',[OrderController::class,'submit']);
});

Route::get('product_order/{o}',[OrderController::class,'product_order']);
Route::get('product_info/{o}',[OrderController::class,'product_info']);
Route::redirect('home','u/home');

Route::get('search',[SearchController::class,'search']);

Route::get('pay/paypal/authorise',[PaypalController::class,'authorise']);
Route::get('pay/paypal/cancel',[PaypalController::class,'cancel']);
Route::get('pay/paypal/capture',[PaypalController::class,'capture']);