<?php

namespace App\Console;

use App\Console\Commands\AddingNewBonusesToBalanceTransactions;
use App\Console\Commands\IssuePartnerCredential;
use App\Console\Commands\BalanceSelfHealing;
use App\Console\Commands\BoostinyOrders;
use App\Console\Commands\BoostinyOrdersBulk;
use App\Console\Commands\CalculatePayoutBalance;
use App\Console\Commands\AddedFirstOrderBonus;
use App\Console\Commands\Cashback\AutoConfirmCashback;
use App\Console\Commands\Cashback\AutoDeclineCashback;
use App\Console\Commands\Cashback\ConfirmBonus;
use App\Console\Commands\Cashback\ExpiredBonus;
use App\Console\Commands\Cashback\ExpiringBonus;
use App\Console\Commands\ConfirmCashback;
use App\Console\Commands\CurrencyExchangeRateCommand;
use App\Console\Commands\DeactivateOldUsers;
use App\Console\Commands\deleteSaleItems;
use App\Console\Commands\ExpiringCashbacksBonuses;
use App\Console\Commands\ExpiringOldCashbacksBonuses;
use App\Console\Commands\Filter\BrandFilterCommand;
use App\Console\Commands\Filter\CategoryFilterCommand;
use App\Console\Commands\Filter\CategoryStoreCountCommand;
use App\Console\Commands\Filter\StoreFilterCommand;
use App\Console\Commands\Filter\TagFilterCommand;
use App\Console\Commands\FixAmazonSales;
use App\Console\Commands\FixDuplicatedPayments;
use App\Console\Commands\FixExpireCashback;
use App\Console\Commands\FixIsValidMerchant;
use App\Console\Commands\fixlocalamounts;
use App\Console\Commands\FixLocalBonuses;
use App\Console\Commands\FixOldOrdersUsers;
use App\Console\Commands\FixOrdersAmount;
use App\Console\Commands\GoogleSheet\UpdateGoogleSheet;
use App\Console\Commands\MakeSettings;
use App\Console\Commands\MapSalesToUserSales;
use App\Console\Commands\MerchantSalesCommand;
use App\Console\Commands\MerchantsQuarterBonusCalculator;
use App\Console\Commands\MerchantsScripts\MerchantsReferAndEarnScript;
use App\Console\Commands\Network\AmazonSelfHealingCommand;
use App\Console\Commands\Network\SalesCommand;
use App\Console\Commands\Network\ValidateLinksCommand;
use App\Console\Commands\paymentAutomation;
use App\Console\Commands\Payouts\CheckPayoutsStatus;
use App\Console\Commands\Payouts\MerchantsPayoutsCreation;
use App\Console\Commands\Payouts\PayoutVerificationStep1;
use App\Console\Commands\Payouts\PayoutVerificationStep2;
use App\Console\Commands\Payouts\unprocessedPayouts;
use App\Console\Commands\recalculateBalanceScript;
use App\Console\Commands\Recommend\BrandRecommendCommand;
use App\Console\Commands\Recommend\CategoryRecommendCommand;
use App\Console\Commands\Recommend\TagRecommendCommand;
use App\Console\Commands\recreatSaleItems;
use App\Console\Commands\ReferBonusScript;
use App\Console\Commands\ReferralBonus;
use App\Console\Commands\RemoveDuplicatedFirstOrderBonus;
use App\Console\Commands\RemoveUnusedSales;
use App\Console\Commands\ResetApprovedPayouts;
use App\Console\Commands\ResettingNegativeBalances;
use App\Console\Commands\rewardOldreferralcashbackBonus;
use App\Console\Commands\RunCashbackCurrencyCommand;
use App\Console\Commands\RunMissingSalesCommand;
use App\Console\Commands\RunUserBalanceCommand;
use App\Console\Commands\RunUserExpiredAmountCommand;
use App\Console\Commands\RunUserSalesCommand;
use App\Console\Commands\Updatebalancetransactioncalculatedate;
use App\Console\Commands\UpdateSales;
use App\Console\Commands\UpdateSalesItems;
use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        ConfirmBonus::class,
        AutoDeclineCashback::class,
        ExpiringBonus::class,
        ExpiredBonus::class,
        CategoryFilterCommand::class,
        BrandFilterCommand::class,
        StoreFilterCommand::class,
        TagFilterCommand::class,
        CategoryStoreCountCommand::class,
        CategoryRecommendCommand::class,
        BrandRecommendCommand::class,
        TagRecommendCommand::class,
        SalesCommand::class,
        MakeSettings::class,
        ValidateLinksCommand::class,
        BalanceSelfHealing::class,
        AutoConfirmCashback::class,
        AmazonSelfHealingCommand::class,
        ReferralBonus::class,
        BoostinyOrders::class,
        FixOldOrdersUsers::class,
        FixLocalBonuses::class,
        CurrencyExchangeRateCommand::class,
        RunUserBalanceCommand::class,
        ExpiringCashbacksBonuses::class,
        ExpiringOldCashbacksBonuses::class,
        DeactivateOldUsers::class,
        RunUserExpiredAmountCommand::class,
        ResettingNegativeBalances::class,
        ConfirmCashback::class,
        RunUserSalesCommand::class,
        MerchantSalesCommand::class,
        RunCashbackCurrencyCommand::class,
        FixExpireCashback::class,
        RunMissingSalesCommand::class,
        CalculatePayoutBalance::class,
        FixOrdersAmount::class,
        RemoveUnusedSales::class,
        AddedFirstOrderBonus::class,
        UpdateSalesItems::class,
        FixIsValidMerchant::class,
        rewardOldreferralcashbackBonus::class,
        recreatSaleItems::class,
        deleteSaleItems::class,
        UpdateSales::class,
        AddedFirstOrderBonus::class,
        paymentAutomation::class,
        ResetApprovedPayouts::class,
        FixDuplicatedPayments::class,
        RemoveDuplicatedFirstOrderBonus::class,
        AddingNewBonusesToBalanceTransactions::class,
        recalculateBalanceScript::class,
        FixAmazonSales::class,
        ReferBonusScript::class,
        Updatebalancetransactioncalculatedate::class,
        BoostinyOrdersBulk::class,
        PayoutVerificationStep1::class,
        PayoutVerificationStep2::class,
        UpdateGoogleSheet::class,
        MerchantsPayoutsCreation::class,
        MerchantsQuarterBonusCalculator::class,
        MerchantsReferAndEarnScript::class,
        MapSalesToUserSales::class,
        unprocessedPayouts::class,
        fixlocalamounts::class,
        CheckPayoutsStatus::class,
        IssuePartnerCredential::class,

    ];

    /**
     * Define the application's command schedule.
     *
     * @param \Illuminate\Console\Scheduling\Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {

        //Cashback crons
//        $schedule->command(ExpiredBonus::class)->dailyAt('02:00');
//        $schedule->command(ExpiringBonus::class)->dailyAt('02:00');
        $schedule->command(ConfirmBonus::class)->dailyAt('02:00');
        //$schedule->command(PayoutVerificationStep1::class, ['user'])->everyFiveMinutes();
        //$schedule->command(PayoutVerificationStep1::class, ['merchants'])->everyFiveMinutes();
//        $schedule->command(AutoDeclineCashback::class)->dailyAt('02:00');

        //Filter crons
        $schedule->command(CategoryFilterCommand::class)->hourly();
        $schedule->command(BrandFilterCommand::class)->hourly();
        $schedule->command(StoreFilterCommand::class)->hourly();
        $schedule->command(TagFilterCommand::class)->hourly();
        $schedule->command(CategoryStoreCountCommand::class)->hourly();

        //Network sales crons
        $schedule->command(SalesCommand::class, [0, 0])->everyFiveMinutes()->withoutOverlapping();
        $schedule->command(SalesCommand::class, [7, 0])->hourly();
        for ($i = 0; $i <= 12; $i++) {
            $schedule->command(SalesCommand::class, [($i + 1) * 30, $i * 30])->dailyAt("$i:00");
        }
        for ($i = 0; $i <=12 ; $i++) {
            $schedule->command(AmazonSelfHealingCommand::class, [($i + 1) * 8, $i * 8])->cron('30 3-9 * * *');

            //3:30 // 4:30 // 5:30 // 6:30 // 7:30 // 8:30
        }
        $schedule->command(ValidateLinksCommand::class)
            ->dailyAt("08:00")
            ->timezone('Africa/Cairo')
            ->environments(['production']);
        /** update Currency Exchange at 10 AM and 6 PM Cairo time */
        $schedule->command(CurrencyExchangeRateCommand::class)
            ->dailyAt("10:00")
            ->timezone('Africa/Cairo');
        $schedule->command(CurrencyExchangeRateCommand::class)
            ->dailyAt("18:00")
            ->timezone('Africa/Cairo');

        /** User Balance Self Healing Command **/
        $schedule->command(BalanceSelfHealing::class)->dailyAt('00:00');
        /* $schedule->command(BoostinyOrders::class, [5])->dailyAt('00:00');
        for ($i = 0; $i <= 12; $i++) {
            $schedule->command(BoostinyOrders::class, [($i * 6)])->dailyAt("$i:00");
        }
        */

        $schedule->command(AutoConfirmCashback::class)->dailyAt("00:00")->timezone('Africa/Cairo');

        //$schedule->command(DeactivateOldUsers::class)->dailyAt("00:00")->timezone('Africa/Cairo');

        $schedule->command(ExpiringCashbacksBonuses::class)->dailyAt("00:00")->timezone('Africa/Cairo');
        $schedule->command(FixLocalBonuses::class)->everyFifteenMinutes()->withoutOverlapping();
        $schedule->command(ExpiringOldCashbacksBonuses::class)->dailyAt("02:00")->timezone('Africa/Cairo');
        //$schedule->command(RunUserBalanceCommand::class)->everyMinute()->withoutOverlapping();
        $schedule->command(RunUserExpiredAmountCommand::class)->everyFifteenMinutes()->withoutOverlapping();
        $schedule->command(RunCashbackCurrencyCommand::class)->everyFifteenMinutes()->withoutOverlapping();

        $schedule->command(ConfirmCashback::class)->everyFifteenMinutes()->withoutOverlapping();
        $schedule->command(RunMissingSalesCommand::class)->everyFifteenMinutes()->withoutOverlapping();

        // User Payouts History
        $schedule->command(CalculatePayoutBalance::class)->everyFifteenMinutes()->withoutOverlapping();
        // update sale items Network_id, Store_id, Click_id and earning_date values
        $schedule->command(UpdateSalesItems::class)->everyFiveMinutes()->withoutOverlapping();
        // assign old transactions cashback bonus
        $schedule->command(rewardOldreferralcashbackBonus::class)->everyThirtyMinutes()->withoutOverlapping();
        // assign first order bonus
        $schedule->command(AddedFirstOrderBonus::class)->everyFifteenMinutes()->withoutOverlapping();
        // process auto manually approved payout
        #$schedule->command(paymentAutomation::class)->cron('0 5 12 10,11,12,13,14,15 * ? *')->withoutOverlapping();

        // inserting new bonuses in balance transactions table
        $schedule->command(AddingNewBonusesToBalanceTransactions::class)->everyFiveMinutes()->withoutOverlapping();
        // Update Referrer boonuses
        $schedule->command(ReferBonusScript::class)->dailyAt("01:30")->timezone('Africa/Cairo');

        //$schedule->command(UpdateGoogleSheet::class)->dailyAt('02:00')->timezone('Africa/Cairo'); // 6 PM
        // Check payouts status every Hour
        $schedule->command(CheckPayoutsStatus::class)->hourly();


    }
}
