<?php

declare(strict_types=1);

use App\Controllers\Admin\AdsController;
use App\Controllers\Admin\AuthController;
use App\Controllers\Admin\ListingClaimsController;
use App\Controllers\Admin\SettingsController;
use App\Controllers\Admin\BlogPostsController;
use App\Controllers\Admin\BusinessesController;
use App\Controllers\Admin\CountiesController;
use App\Controllers\Admin\CountyTradePagesController;
use App\Controllers\Admin\DashboardController;
use App\Controllers\Admin\ListingsController;
use App\Controllers\Admin\TradeTypesController;
use App\Controllers\BlogPublicController;
use App\Controllers\Business\AccountController as BusinessAccountController;
use App\Controllers\Business\BillingController as BusinessBillingController;
use App\Controllers\Business\ClaimController as BusinessClaimController;
use App\Controllers\Business\ListingController as BusinessListingController;
use App\Controllers\Business\PortalController as BusinessPortalController;
use App\Controllers\Business\QuoteController as BusinessQuoteController;
use App\Controllers\CountyController;
use App\Controllers\ListingController;
use App\Controllers\PublicController;
use App\Controllers\RobotsController;
use App\Controllers\SitemapController;
use App\Controllers\StaticController;
use App\Controllers\StripeWebhookController;
use App\Core\Router;

return static function (Router $router): void {
    $router->get('/', fn () => (new PublicController())->home());
    $router->get('/search', fn () => (new PublicController())->searchRedirect());

    $router->get('/about', fn () => (new StaticController())->about());
    $router->get('/contact', fn () => (new StaticController())->contactGet());
    $router->post('/contact', fn () => (new StaticController())->contactPost());
    $router->get('/advertise', fn () => (new StaticController())->advertiseGet());
    $router->post('/advertise', fn () => (new StaticController())->advertisePost());
    $router->post('/advertise/subscribe', fn () => (new StaticController())->advertiseSubscribePost());
    $router->get('/advertise/subscribe/setup-success', fn () => (new StaticController())->advertiseSubscribeSetupSuccess());
    $router->get('/advertise/approval/{token}', fn (array $p) => (new StaticController())->advertiseApproval($p));
    $router->post('/advertise/approval/{token}', fn (array $p) => (new StaticController())->advertiseApprovalPost($p));
    $router->get('/privacy', fn () => (new StaticController())->privacy());
    $router->get('/terms', fn () => (new StaticController())->terms());

    $router->get('/blog', fn () => (new BlogPublicController())->index());
    $router->get('/blog/{slug}', fn (array $p) => (new BlogPublicController())->show($p));

    $router->get('/listing/{slug}', fn (array $p) => (new ListingController())->show($p));
    $router->post('/listing/{slug}/quote', fn (array $p) => (new ListingController())->quotePost($p));
    $router->get('/listing/{slug}/website-click', fn (array $p) => (new ListingController())->websiteClick($p));

    $router->get('/business/register', fn () => (new BusinessAccountController())->registerForm());
    $router->post('/business/register', fn () => (new BusinessAccountController())->registerPost());
    $router->get('/business/login', fn () => (new BusinessAccountController())->loginForm());
    $router->post('/business/login', fn () => (new BusinessAccountController())->loginPost());
    $router->get('/business/logout', fn () => (new BusinessAccountController())->logout());
    $router->get('/business', fn () => (new BusinessPortalController())->dashboard());
    $router->get('/business/listings', fn () => (new BusinessListingController())->index());
    $router->get('/business/listings/new', fn () => (new BusinessListingController())->createForm());
    $router->post('/business/listings/new', fn () => (new BusinessListingController())->create());
    $router->get('/business/listings/edit/{id}', fn (array $p) => (new BusinessListingController())->editForm($p));
    $router->post('/business/listings/edit/{id}', fn (array $p) => (new BusinessListingController())->update($p));
    $router->get('/business/listings/upgrade/{id}', fn (array $p) => (new BusinessBillingController())->upgradeForm($p));
    $router->post('/business/listings/upgrade/{id}', fn (array $p) => (new BusinessBillingController())->upgradeCheckout($p));
    $router->get('/business/listings/upgrade/{id}/success', fn (array $p) => (new BusinessBillingController())->upgradeSuccess($p));
    $router->get('/business/quotes', fn () => (new BusinessQuoteController())->index());
    $router->post('/business/quotes/{id}', fn (array $p) => (new BusinessQuoteController())->update($p));
    $router->get('/business/claim', fn () => (new BusinessClaimController())->form());
    $router->post('/business/claim', fn () => (new BusinessClaimController())->submit());
    $router->get('/business/claim/verify', fn () => (new BusinessClaimController())->verify());

    $router->get('/robots.txt', fn () => (new RobotsController())->index());
    $router->get('/sitemap.xml', fn () => (new SitemapController())->index());
    $router->post('/stripe/webhook', fn () => (new StripeWebhookController())->handle());

    $router->get('/admin', fn () => (new DashboardController())->index());
    $router->get('/admin/settings', fn () => (new SettingsController())->edit());
    $router->post('/admin/settings', fn () => (new SettingsController())->save());
    $router->get('/admin/login', fn () => (new AuthController())->loginForm());
    $router->post('/admin/login', fn () => (new AuthController())->loginPost());
    $router->get('/admin/logout', fn () => (new AuthController())->logout());

    $router->get('/admin/listings', fn () => (new ListingsController())->index());
    $router->get('/admin/listings/new', fn () => (new ListingsController())->createForm());
    $router->post('/admin/listings/new', fn () => (new ListingsController())->create());
    $router->get('/admin/listings/edit/{id}', fn (array $p) => (new ListingsController())->editForm($p));
    $router->post('/admin/listings/edit/{id}', fn (array $p) => (new ListingsController())->update($p));
    $router->post('/admin/listings/delete/{id}', fn (array $p) => (new ListingsController())->delete($p));
    $router->get('/admin/businesses', fn () => (new BusinessesController())->index());
    $router->get('/admin/businesses/search', fn () => (new BusinessesController())->search());
    $router->get('/admin/businesses/{id}', fn (array $p) => (new BusinessesController())->show($p));
    $router->post('/admin/businesses/{id}/update', fn (array $p) => (new BusinessesController())->update($p));

    $router->get('/admin/counties', fn () => (new CountiesController())->index());
    $router->get('/admin/counties/new', fn () => (new CountiesController())->createForm());
    $router->post('/admin/counties/new', fn () => (new CountiesController())->create());
    $router->get('/admin/counties/edit/{id}', fn (array $p) => (new CountiesController())->editForm($p));
    $router->post('/admin/counties/edit/{id}', fn (array $p) => (new CountiesController())->update($p));
    $router->post('/admin/counties/delete/{id}', fn (array $p) => (new CountiesController())->delete($p));

    $router->get('/admin/trades', fn () => (new TradeTypesController())->index());
    $router->get('/admin/trades/new', fn () => (new TradeTypesController())->createForm());
    $router->post('/admin/trades/new', fn () => (new TradeTypesController())->create());
    $router->get('/admin/trades/edit/{id}', fn (array $p) => (new TradeTypesController())->editForm($p));
    $router->post('/admin/trades/edit/{id}', fn (array $p) => (new TradeTypesController())->update($p));
    $router->post('/admin/trades/delete/{id}', fn (array $p) => (new TradeTypesController())->delete($p));

    $router->get('/admin/county-trade-pages', fn () => (new CountyTradePagesController())->index());
    $router->get(
        '/admin/county-trade-pages/edit/{county_id}/{trade_id}',
        fn (array $p) => (new CountyTradePagesController())->editForm($p)
    );
    $router->post('/admin/county-trade-pages/save', fn () => (new CountyTradePagesController())->save());
    $router->post('/admin/county-trade-pages/delete/{id}', fn (array $p) => (new CountyTradePagesController())->delete($p));

    $router->get('/admin/blog', fn () => (new BlogPostsController())->index());
    $router->get('/admin/blog/new', fn () => (new BlogPostsController())->createForm());
    $router->post('/admin/blog/new', fn () => (new BlogPostsController())->create());
    $router->get('/admin/blog/edit/{id}', fn (array $p) => (new BlogPostsController())->editForm($p));
    $router->post('/admin/blog/edit/{id}', fn (array $p) => (new BlogPostsController())->update($p));
    $router->post('/admin/blog/delete/{id}', fn (array $p) => (new BlogPostsController())->delete($p));

    $router->get('/admin/claims', fn () => (new ListingClaimsController())->index());
    $router->post('/admin/claims/approve/{id}', fn (array $p) => (new ListingClaimsController())->approve($p));
    $router->post('/admin/claims/reject/{id}', fn (array $p) => (new ListingClaimsController())->reject($p));

    $router->get('/admin/ads', fn () => (new AdsController())->index());
    $router->get('/admin/ads/new', fn () => (new AdsController())->createForm());
    $router->post('/admin/ads/new', fn () => (new AdsController())->create());
    $router->get('/admin/ads/edit/{id}', fn (array $p) => (new AdsController())->editForm($p));
    $router->post('/admin/ads/edit/{id}', fn (array $p) => (new AdsController())->update($p));
    $router->post('/admin/ads/delete/{id}', fn (array $p) => (new AdsController())->delete($p));
    $router->get('/admin/ads/products/new', fn () => (new AdsController())->productCreateForm());
    $router->post('/admin/ads/products/new', fn () => (new AdsController())->productCreate());
    $router->get('/admin/ads/products/edit/{id}', fn (array $p) => (new AdsController())->productEditForm($p));
    $router->post('/admin/ads/products/edit/{id}', fn (array $p) => (new AdsController())->productUpdate($p));
    $router->post('/admin/ads/products/delete/{id}', fn (array $p) => (new AdsController())->productDelete($p));
    $router->post('/admin/ads/subscriptions/{id}/status', fn (array $p) => (new AdsController())->subscriptionStatusUpdate($p));
    $router->get('/admin/ads/subscriptions/{id}/creative', fn (array $p) => (new AdsController())->subscriptionCreativeForm($p));
    $router->post('/admin/ads/subscriptions/{id}/creative', fn (array $p) => (new AdsController())->subscriptionCreativeUpdate($p));
    $router->post('/admin/ads/subscriptions/{id}/request-approval', fn (array $p) => (new AdsController())->subscriptionRequestApproval($p));

    $router->get('/{county_slug}/{trade_slug}', fn (array $p) => (new CountyController())->trade($p));
    $router->get('/{county_slug}', fn (array $p) => (new CountyController())->show($p));
};
