<?php

namespace Yajny\EventsYj;

use App\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Auth\Events\Registered;
use Yajny\EventsYj\Commands\EventYjGenerateCommand;
use Yajny\EventsYj\Commands\EventYjMakeCommand;
use Yajny\EventsYj\Commands\ListnerYjMakeCommand;
use Yajny\EventsYj\Events\BonusExpired;
use Yajny\EventsYj\Events\BonusExpireSoon;
use Yajny\EventsYj\Events\BonusNew;
use Yajny\EventsYj\Events\BonusUpdated;
use Yajny\EventsYj\Events\CashbackExpired;
use Yajny\EventsYj\Events\CashbackNew;
use Yajny\EventsYj\Events\CashbackUpdated;
use Yajny\EventsYj\Events\ClaimCommented;
use Yajny\EventsYj\Events\ClaimNew;
use Yajny\EventsYj\Events\ClaimUpdated;
use Yajny\EventsYj\Events\ContactNew;
use Yajny\EventsYj\Events\LoyaltyAchievement;
use Yajny\EventsYj\Events\NewBonusExpired;
use Yajny\EventsYj\Events\NewAddedModerator;
use Yajny\EventsYj\Events\NewBonusNew;
use Yajny\EventsYj\Events\NewBonusUpdated;
use Yajny\EventsYj\Events\NewMember;
use Yajny\EventsYj\Events\PayoutModeNew;
use Yajny\EventsYj\Events\PayoutNew;
use Yajny\EventsYj\Events\PayoutUpdated;
use Yajny\EventsYj\Events\ProcessPayoutEvent;
use Yajny\EventsYj\Events\RecalculateBalance;
use Yajny\EventsYj\Events\RecalculateBalanceHistory;
use Yajny\EventsYj\Events\ReferralBonusNew;
use Yajny\EventsYj\Events\ReferralBonusUpdated;
use Yajny\EventsYj\Events\ReferralInvite;
use Yajny\EventsYj\Events\SaleNew;
use Yajny\EventsYj\Events\SaleUpdated;
use Yajny\EventsYj\Events\SendOTP;
use Yajny\EventsYj\Events\TestEvent;
use Yajny\EventsYj\Events\WebhookNew;
use Yajny\EventsYj\Listeners\AccountVerifiedWelcome;
use Yajny\EventsYj\Listeners\AckContact;
use Yajny\EventsYj\Listeners\AddedModeratorWelcome;
use Yajny\EventsYj\Listeners\AwardBonus;
use Yajny\EventsYj\Listeners\AwardCashback;
use Yajny\EventsYj\Listeners\AwardNewBonus;
use Yajny\EventsYj\Listeners\AwardReferralBonus;
use Yajny\EventsYj\Listeners\CalculateBalanceHistory;
use Yajny\EventsYj\Listeners\FirstOrderBonus;
use Yajny\EventsYj\Listeners\InformBonusExpiry;
use Yajny\EventsYj\Listeners\InformClaimComment;
use Yajny\EventsYj\Listeners\InviteUserReferral;
use Yajny\EventsYj\Listeners\LoyaltyProgramAchievement;
use Yajny\EventsYj\Listeners\LoyaltyProgramInitiator;
use Yajny\EventsYj\Listeners\LoyaltyProgramProgress;
use Yajny\EventsYj\Listeners\MemberInit;
use Yajny\EventsYj\Listeners\NewReferralBonus;
use Yajny\EventsYj\Listeners\NewReferralCashbackBonus;
use Yajny\EventsYj\Listeners\PayoutListeners\AmanPayoutListener;
use Yajny\EventsYj\Listeners\PayoutListeners\BankTransferPayoutListener;
use Yajny\EventsYj\Listeners\PayoutListeners\CashUPayoutListener;
use Yajny\EventsYj\Listeners\PayoutListeners\EWalletPayoutListener;
use Yajny\EventsYj\Listeners\PostbackBoostinyNew;
use Yajny\EventsYj\Listeners\PostbackBoostinyUpdate;
use Yajny\EventsYj\Listeners\RecalculateUserBalance;
use Yajny\EventsYj\Listeners\RecordClaim;
use Yajny\EventsYj\Listeners\RecordPayout;
use Yajny\EventsYj\Listeners\SaleCashbackUpdate;
use Yajny\EventsYj\Listeners\SaleToCashback;
use Yajny\EventsYj\Listeners\SendEmailVerificationNotification;
use Yajny\EventsYj\Listeners\SendPasswordResetNotification;
use Yajny\EventsYj\Listeners\SendPayoutVerification;
use Yajny\EventsYj\Listeners\SMSListeners\EgyptianCequensSender;
use Yajny\EventsYj\Listeners\SMSListeners\GulfCequensSender;
use Yajny\EventsYj\Listeners\TestListener;
use Yajny\EventsYj\Listeners\Trackers\Adjust\AdjustTriggerCashbackEvent;
use Yajny\EventsYj\Listeners\Trackers\CleverTap\CleverTapTriggerCashbackEvent;
use Yajny\EventsYj\Listeners\Trackers\CleverTap\CleverTapTriggerCashbackEventV2;
use Yajny\EventsYj\Listeners\Trackers\CleverTap\CleverTapTriggerPayoutEvent;
use Yajny\EventsYj\Listeners\Trackers\Facebook\FacebookTriggerCashbackEvent;
use Yajny\EventsYj\Listeners\Trackers\YajnyAnalytics\YajnyAnalyticsTriggerCashbackEvent;
use Yajny\EventsYj\Listeners\Trackers\YajnyAnalytics\YajnyAnalyticsTriggerCashbackUpdateEvent;
use Yajny\EventsYj\Listeners\UpdateBonusExpiry;
use Yajny\EventsYj\Listeners\UpdateCashback;
use Yajny\EventsYj\Listeners\UpdateClaim;
use Yajny\EventsYj\Listeners\UpdatedBonus;
use Yajny\EventsYj\Listeners\UpdatedNewBonus;
use Yajny\EventsYj\Listeners\UpdatePayout;
use Yajny\EventsYj\Listeners\UpdateReferralBonus;
use Yajny\EventsYj\Listeners\UserExpiredAmountAdded;
use Yajny\EventsYj\Listeners\WebhooksHandlers\WebhookHandler;

class EventsYjServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        TestEvent::class => [
            TestListener::class,
        ],
        NewMember::class => [
            MemberInit::class,
        ],
        CashbackNew::class => [
            AwardCashback::class,
            LoyaltyProgramInitiator::class,
            LoyaltyProgramProgress::class,
            CleverTapTriggerCashbackEvent::class,
            CleverTapTriggerCashbackEventV2::class,
            AdjustTriggerCashbackEvent::class,
            FacebookTriggerCashbackEvent::class,
            YajnyAnalyticsTriggerCashbackEvent::class,
            RecalculateUserBalance::class
        ],
        CashbackUpdated::class => [
            UpdateCashback::class,
            NewReferralCashbackBonus::class,
            LoyaltyProgramInitiator::class,
            CleverTapTriggerCashbackEvent::class,
            YajnyAnalyticsTriggerCashbackUpdateEvent::class,
            RecalculateUserBalance::class,
        ],
        CashbackExpired::class => [
            RecalculateUserBalance::class,
            UserExpiredAmountAdded::class,
        ],
        PayoutNew::class => [
            RecordPayout::class,
            CleverTapTriggerPayoutEvent::class,
            //YajnyAnalyticsTriggerPayoutEvent::class,
        ],
        PayoutUpdated::class => [
            UpdatePayout::class,
            CleverTapTriggerPayoutEvent::class,
            RecalculateUserBalance::class
        ],
        BonusNew::class => [
            AwardBonus::class,
            RecalculateUserBalance::class
        ],
        BonusUpdated::class => [
            UpdatedBonus::class,
            RecalculateUserBalance::class
        ],
        NewBonusNew::class => [
            AwardNewBonus::class,
            RecalculateUserBalance::class
        ],
        NewBonusUpdated::class => [
            UpdatedNewBonus::class,
            RecalculateUserBalance::class
        ],
        BonusExpireSoon::class => [
            InformBonusExpiry::class
        ],
        BonusExpired::class => [
            UpdateBonusExpiry::class,
            RecalculateUserBalance::class,
            UserExpiredAmountAdded::class,
        ],
        NewBonusExpired::class => [
            RecalculateUserBalance::class,
            UserExpiredAmountAdded::class,
        ],
        ReferralBonusNew::class => [
            AwardReferralBonus::class
        ],
        ReferralBonusUpdated::class => [
            UpdateReferralBonus::class
        ],
        ClaimNew::class => [
            RecordClaim::class
        ],
        ClaimUpdated::class => [
            UpdateClaim::class
        ],
        ClaimCommented::class => [
            InformClaimComment::class
        ],
        ReferralInvite::class => [
            InviteUserReferral::class
        ],
        ContactNew::class => [
            AckContact::class
        ],
        PayoutModeNew::class => [
            SendPayoutVerification::class
        ],
        ProcessPayoutEvent::class => [
            EWalletPayoutListener::class,
            AmanPayoutListener::class,
            BankTransferPayoutListener::class,
            CashUPayoutListener::class,
        ],
        Illuminate\Auth\Events\Verified::class => [
            // Send Verified Email
            AccountVerifiedWelcome::class
        ],
        NewAddedModerator::class => [
            // Send Welcome Email to new Moderator
            AddedModeratorWelcome::class
        ],
        PasswordReset::class => [
            SendPasswordResetNotification::class
        ],
        SaleNew::class => [
            SaleToCashback::class,
            PostbackBoostinyNew::class,
        ],
        SaleUpdated::class => [
            SaleCashbackUpdate::class,
            NewReferralBonus::class,
            PostbackBoostinyUpdate::class,
        ],
        SendOTP::class => [
            EgyptianCequensSender::class,
            GulfCequensSender::class
        ],
        WebhookNew::class => [
            WebhookHandler::class
        ],
        RecalculateBalanceHistory::class => [
            CalculateBalanceHistory::class
        ],
        LoyaltyAchievement::class => [
            LoyaltyProgramAchievement::class
        ],
        RecalculateBalance::class => [
            RecalculateUserBalance::class,
        ],
        // 'Yajny\EventsYj\Events\SaleNew' => [
        //     'Yajny\EventsYj\Listeners\SaleToCashback'
        // ]
    ];


    /**
     * Bootstrap the application services.
     */

    public function boot()
    {
        // if ($this->app->runningInConsole()) {
        //     $this->commands([

        //         EventYjGenerateCommand::class,
        //         EventYjMakeCommand::class,
        //     ]);
        // }
        $this->commands([
            EventYjGenerateCommand::class,
            EventYjMakeCommand::class,
            ListnerYjMakeCommand::class,
        ]);

        parent::boot();
    }

    /**
     * Register the application services.
     */
    public function register()
    {
        // Automatically apply the package configuration
        $this->mergeConfigFrom(__DIR__ . '/../config/config.php', 'EventsYj');

        // Register the main class to use with the facade
        $this->app->singleton('EventsYj', function () {
            return new EventsYj;
        });
    }
}
