<?php

namespace App\Providers;

use App\Models\User\User;
use Dedoc\Scramble\Scramble;
use Dedoc\Scramble\Support\Generator\OpenApi;
use Dedoc\Scramble\Support\Generator\SecurityScheme;
use Illuminate\Cookie\CookieValuePrefix;
use Illuminate\Support\Facades\Cookie;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use App\Validation\BailingValidator;
use Illuminate\Contracts\Translation\Translator;
use Illuminate\Contracts\Validation\Factory;
use Illuminate\Support\Str;
use Laravel\Jetstream\Jetstream;
use Illuminate\Routing\Route;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        Jetstream::ignoreRoutes();

        if ($this->app->environment('local')) {
            //$this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class);
        }
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $isMobileInstance =  is_mobile_instance();

        View::share('mobileApp', $isMobileInstance);

        $cookie = Cookie::get('theme');
        $mode = '';

        if($isMobileInstance) {
            View::share('themeMode', 'dark');
        } else {

            if($cookie) {
                try {
                    View::share('themeMode', CookieValuePrefix::remove(Crypt::decryptString((Cookie::get('theme')))));
                } catch (\Exception $e) {
                    View::share('themeMode', 'dark');
                }
            } else {

                try {

                    $settingsLoaded = Schema::hasTable('settings');

                    if ($settingsLoaded) {

                        $darkEnabled = setting('general.dark_mode_status', false);

                        if ($darkEnabled) {

                            if (setting('general.default_dark_mode_status', false)) {
                                $mode = 'dark';
                            }
                        }
                    }
                } catch (\Exception $e) {

                }

                View::share('themeMode', $mode);

            }

            Scramble::afterOpenApiGenerated(function (OpenApi $openApi) {
                $openApi->secure(
                    SecurityScheme::http('bearer', 'JWT')
                );
            });

            Scramble::routes(function (Route $route) {

                if(env('HIDE_CMC_GECKO')) {
                    return Str::startsWith($route->uri, 'api/')
                        && !in_array('PUT', $route->methods)
                        && !in_array('DELETE', $route->methods)
                        && !Str::startsWith($route->uri, 'api/v1/spot')
                        && !Str::startsWith($route->uri, 'api/v1/gateways')
                        && !Str::startsWith($route->uri, 'api/v1/server')
                        && !Str::startsWith($route->uri, 'api/v1/currencies/rates-balance')
                        && !Str::startsWith($route->uri, 'api/v1/perfect-money')
                        && !Str::startsWith($route->uri, 'api/v1/check-auth')
                        && !Str::startsWith($route->uri, 'api/v1/qr-code-token')
                        && !Str::startsWith($route->uri, 'api/v1/wallets/payment/stripe')
                        && !Str::startsWith($route->uri, 'api/broadcasting');
                }

                return Str::startsWith($route->uri, 'api/')
                    && !in_array('PUT', $route->methods)
                    && !in_array('DELETE', $route->methods)
                    && !Str::startsWith($route->uri, 'api/v1/gateways')
                    && !Str::startsWith($route->uri, 'api/v1/server')
                    && !Str::startsWith($route->uri, 'api/v1/currencies/rates-balance')
                    && !Str::startsWith($route->uri, 'api/v1/perfect-money')
                    && !Str::startsWith($route->uri, 'api/v1/check-auth')
                    && !Str::startsWith($route->uri, 'api/v1/qr-code-token')
                    && !Str::startsWith($route->uri, 'api/v1/wallets/payment/stripe')
                    && !Str::startsWith($route->uri, 'api/broadcasting');
            });

            Gate::define('viewApiDocs', function (User $user) {
                return true;
            });
        }

        /**
         * @var \Illuminate\Validation\Factory $factory
         */
        $factory = resolve(Factory::class);

        $factory->resolver(function (Translator $translator, array $data, array $rules, array $messages, array $customAttributes) {
            return new BailingValidator($translator, $data, $rules, $messages, $customAttributes);
        });
    }
}
