<?php

namespace App\Providers;

use App\Models\Goliath\GoliathAppliance;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{

    public const HOME = '/home';

    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            // Register standard routes.
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));       
        });
    }

    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {

            if($this->isWhitelisted($request->ip())) {
                return Limit::perMinute(500)->by($request->ip());
            }
            else {

                if(str_contains($request->url(), "/tiles/")) {
                    return Limit::perMinute(2048)->by('MAP-' . (optional($request->user())->id ?: $request->ip()));
                }

                if($request->method() === 'GET') {
                    return Limit::perMinute($request->user() ? 128 : 16)->by('READ-' . (optional($request->user())->id ?: $request->ip()));
                }
                else {
                    return Limit::perMinute(16)->by('WRITE-' . (optional($request->user())->id ?: $request->ip()));
                }

            }
            
        });

    }

    protected function isWhitelisted(string $ip): bool
    {
        static $staticIps = ['103.212.226.249', '103.212.227.15'];

        if (in_array($ip, $staticIps, true)) {
            return true;
        }

        return Cache::remember("ratelimit:whitelist:{$ip}", now()->addMinutes(5), fn () => GoliathAppliance::where('address', $ip)->exists());
    }
}
