<?php

use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\v1\CurrencyController;
use App\Http\Controllers\Api\v1\MarketController;
use App\Http\Controllers\Api\v1\OrderController;
use App\Http\Controllers\Api\v1\WalletController;
use App\Http\Controllers\Api\v1\LaunchpadController;
use App\Http\Controllers\Api\v1\StakingController;
use App\Http\Controllers\Api\v1\TransactionController;
use App\Http\Controllers\Api\v1\Gateways\CoinpaymentsController;
use App\Http\Controllers\Api\v1\FuturesController;
use App\Http\Controllers\Api\v1\Gateways\EthereumController;
use App\Http\Controllers\Api\v1\SettingController;
use App\Http\Controllers\Api\v1\Gateways\BscController;
use App\Http\Controllers\Api\v1\Gateways\BitcoinController;
use App\Http\Controllers\Api\v1\Cmc\MarketCmcController;
use App\Http\Controllers\Api\v1\Cmc\MarketCoingeckoController;
use App\Http\Controllers\Api\v1\Gateways\StripeController;
use App\Http\Controllers\Web\Client\ArticleController;
use App\Http\Controllers\Web\Client\MarketController as MarketClientController;
use App\Http\Controllers\Web\Client\WalletController as WalletClientController;
use App\Http\Controllers\Web\Client\LaunchpadController as LaunchpadClientController;
use App\Http\Controllers\Web\Client\StakingController as StakingClientController;
use App\Http\Controllers\Api\v1\Gateways\PerfectMoneyController;
use App\Http\Controllers\Api\v1\SumsubController;
/*
 *
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Broadcast::routes(['middleware' => ['auth:sanctum']]);

Route::get('/servertime', [SettingController::class, 'time'])->name('server-time');

Route::group(['prefix' => 'v1', 'middle', 'middleware' => ['throttle:api']], function () {

    Route::post('auth/token', [SettingController::class, 'auth'])->name('auth.token');

    Route::get('check-auth', [SettingController::class, 'checkAuth'])->name('auth.checkAuth');
    Route::get('qr-code-token', [SettingController::class, 'getQrCodeToken'])->name('auth.qr-code-token');

    Route::get('language/file', [SettingController::class, 'languageFile'])->name('language.file');

    Route::get('countries', [SettingController::class, 'countries'])->name('countries');

    Route::get('articles/featured', [ArticleController::class, 'featured'])->name('articles.featured');

    Route::group(['middleware' => ['throttle:time']], function () {
        Route::get('/site-status', [SettingController::class, 'siteStatus'])->name('site-status');
        Route::get('/server-time', [SettingController::class, 'time'])->name('server-time');
    });

    // Launchpads
    Route::get('launchpads', [LaunchpadController::class, 'index'])->name('launchpads.api.list');
    Route::get('launchpad', [LaunchpadController::class, 'show'])->name('launchpads.api.show');

    Route::get('stakings', [StakingController::class, 'index'])->name('stakings.api.list');
    Route::get('staking', [StakingController::class, 'show'])->name('stakings.api.show');


    Route::group(['middleware' => ['auth:sanctum', 'maintenance']], function () {

        Route::get('/stakings/my', [StakingController::class, 'my'])->name('stakings.api.my');

        Route::get('/auth/user', [SettingController::class, 'user'])->name('auth.user');

        Route::post('/orders/cancel', [OrderController::class, 'cancel'])->name('orders.api.cancel');
        Route::get('/orders/open', [OrderController::class, 'open'])->name('orders.api.open');
        Route::get('/orders/history', [OrderController::class, 'orderHistory'])->name('orders.api.history');
        Route::get('/orders/trades', [OrderController::class, 'tradeHistory'])->name('orders.api.trades');

        Route::post('/orders/futures/cancel', [FuturesController::class, 'cancel'])->name('orders.api.futures.cancel');
        Route::get('/orders/futures/open', [FuturesController::class, 'open'])->name('orders.api.futures.open');


        Route::get('/markets/userTrades', [MarketController::class, 'userTrades'])->name('markets.api.user.trades');

        // Transactions routes
        Route::get('/transactions/deposits/crypto', [TransactionController::class, 'depositsCrypto'])->name('transactions.api.deposits.crypto');
        Route::get('/transactions/withdrawals/crypto', [TransactionController::class, 'withdrawalsCrypto'])->name('transactions.api.withdrawals.crypto');
        Route::get('/transactions/trades', [TransactionController::class, 'trades'])->name('transactions.api.trades');
        Route::get('/transactions/futures-trades', [TransactionController::class, 'futuresTrades'])->name('transactions.api.futures.trades');
        Route::get('/transactions/orders', [TransactionController::class, 'orders'])->name('transactions.api.orders');
        Route::get('/transactions/launchpads', [TransactionController::class, 'launchpads'])->name('transactions.api.launchpads');

        // Wallet routes
        Route::get('/wallets/getAddress', [WalletController::class, 'getAddress'])->name('wallets.api.getAddress');
        Route::get('/wallets/balance', [WalletClientController::class, 'getBalance'])->name('wallets.api.getBalance');
        Route::get('/wallets/deposit/networks', [WalletController::class, 'loadNetworks'])->name('wallets.api.deposit.networks');

        Route::post('launchpad/submit', [LaunchpadClientController::class, 'submit'])->name('launchpads.api.submit');

        /*
         * Staking
         */
        Route::post('staking/submit', [StakingClientController::class, 'submit'])->name('staking.api.submit');
        Route::post('staking/redeem', [StakingClientController::class, 'redeem'])->name('staking.api.redeem');
        Route::post('staking/redemption/calculate', [StakingClientController::class, 'redemptionCalculate'])->name('staking.api.redemption.calculate');

        // Deposit routes
        Route::get('/wallets/deposits/{type}', [WalletController::class, 'getDeposits'])->name('wallets.api.deposits');
        Route::get('/wallets/fiat-deposits/{type?}', [WalletController::class, 'getFiatDeposits'])->name('wallets.api.deposits.fiat');

        Route::get('/wallets/deposit/crypto', [WalletController::class, 'getDepositInfo'])->name('wallets.api.deposit.crypto.info');
        Route::get('/wallets/withdraw/crypto', [WalletController::class, 'getWithdrawInfo'])->name('wallets.api.withdraw.crypto.info');

        // Withdraw routes
        Route::get('/wallets/withdrawals/{type}', [WalletController::class, 'getWithdrawals'])->name('wallets.api.withdrawals');
        Route::post('/wallets/withdraw', [WalletController::class, 'withdraw'])->name('wallets.api.withdraw');
        Route::get('/wallets/fiat-withdrawals', [WalletController::class, 'getFiatWithdrawals'])->name('wallets.api.withdrawals.fiat');

        Route::post('/wallets/payment/stripe/init', [WalletController::class, 'stripePayment'])->name('wallets.api.deposit.fiat.stripe.load');
        Route::post('/wallets/payment/stripe/validate', [WalletController::class, 'stripePaymentValidate'])->name('wallets.api.deposit.fiat.stripe.validate');

        Route::resource('wallets', WalletController::class);

        Route::get('/currencies/rates-balance', [CurrencyController::class, 'rates'])->name('currencies.api.rates-balance');

        // API For Mobile
        Route::get('/wallets/deposit/coin', [WalletController::class, 'depositCrypto'])->name('wallets.api.deposit.coin');
    });

    Route::get('/networks', [WalletController::class, 'getNetworks'])->name('wallets.api.networks');

    Route::get('/markets/exchange_rate', [MarketClientController::class, 'exchangeRate'])->name('markets.api.exchange_rate');
    Route::get('/market/info', [MarketController::class, 'marketInfo'])->name('market.api.info');

    Route::get('/markets/swap/info', [MarketController::class, 'swap'])->name('markets.api.swap');
    Route::get('/markets/ticker', [MarketController::class, 'ticker'])->name('markets.api.ticker');
    Route::get('/markets/trades', [MarketController::class, 'trades'])->name('markets.api.trades');
    Route::get('/markets/candles/{query?}', [MarketController::class, 'candles'])->name('markets.api.candles');
    Route::get('/markets/orderbook', [MarketController::class, 'orderbook'])->name('markets.api.orderbook');
    Route::get('/markets/historical/trades', [MarketController::class, 'historicalTrades'])->name('markets.api.historical.trades');


    Route::resource('currencies', CurrencyController::class);

    Route::resource('markets', MarketController::class);
    Route::resource('orders', OrderController::class);
    Route::resource('futures', FuturesController::class);

    // Coinmarketcap & CoinGecko Routes
    Route::group(['prefix' => 'spot'], function () {

        // CMC endpoints
        Route::get('/markets', [MarketCmcController::class, 'markets']);
        Route::get('/ticker', [MarketCmcController::class, 'ticker']);
        Route::get('/orderbook', [MarketCmcController::class, 'orderbook']);
        Route::get('/trades', [MarketCmcController::class, 'trades']);
        Route::get('/assets', [MarketCmcController::class, 'assets']);

        // CoinGecko endpoints
        Route::get('/cg/pairs', [MarketCoingeckoController::class, 'pairs']);
        Route::get('/cg/tickers', [MarketCoingeckoController::class, 'tickers']);
        Route::get('/cg/orderbook', [MarketCoingeckoController::class, 'orderbook']);
        Route::get('/cg/historical_trades', [MarketCoingeckoController::class, 'historicalTrades']);
    });

    // Coinpayments
    Route::post('/gateways/coinpayments', [CoinpaymentsController::class, 'ipn'])->name('coinpayments.ipn');

    // Perfect Money IPN
    Route::post('/perfect-money/ipn', [PerfectMoneyController::class, 'ipn'])->name('perfectmoney.ipn');

    // Ethereum
    Route::post('/gateways/ethereum', [EthereumController::class, 'ipn'])->name('ethereum.ipn');

    // BSC Network
    Route::post('/gateways/bnb', [BscController::class, 'ipn'])->name('bnb.ipn');

    // Bitcoin
    Route::get('/gateways/bitcoin/{symbol}', [BitcoinController::class, 'ipn'])->name('bitcoin.ipn');

    // Stripe
    Route::post('/gateways/stripe', [StripeController::class, 'ipn'])->name('stripe.ipn');

    // Sumsub IPN
    Route::post('sumsub/ipn', [SumsubController::class, 'ipn'])->name('sumsub.ipn');

});
