<?php
namespace App\Traits;

use App\Constants\Status;

trait UserNotify {
    public static function notifyToUser() {
        return [
            'allUsers'               => 'All Users',
            'selectedUsers'          => 'Selected Users',
            'kycUnverified'          => 'Kyc Unverified Users',
            'kycVerified'            => 'Kyc Verified Users',
            'kycPending'             => 'Kyc Pending Users',
            'withBalance'            => 'With Balance Users',
            'emptyBalanceUsers'      => 'Empty Balance Users',
            'twoFaDisableUsers'      => '2FA Disable User',
            'twoFaEnableUsers'       => '2FA Enable User',
            'hasDepositedUsers'      => 'Paymented Users',
            'notDepositedUsers'      => 'Not Paymented Users',
            'pendingDepositedUsers'  => 'Pending Paymented Users',
            'rejectedDepositedUsers' => 'Rejected Paymented Users',
            'topDepositedUsers'      => 'Top Paymented Users',
            'hasWithdrawUsers'       => 'Withdraw Users',
            'pendingWithdrawUsers'   => 'Pending Withdraw Users',
            'rejectedWithdrawUsers'  => 'Rejected Withdraw Users',
            'pendingTicketUser'      => 'Pending Ticket Users',
            'answerTicketUser'       => 'Answer Ticket Users',
            'closedTicketUser'       => 'Closed Ticket Users',
            'notLoginUsers'          => 'Last Few Days Not Login Users',
            'monetizationApproved'   => 'Monetization Approved',
            'advertiserUser'   => 'Advertiser User',
            'usersWhoHasVideo'=> 'Users With Videos and Shorts',
            'usersWhoHasRegulerVideos'=> 'Users With Videos',
            'usersWhoHasShorts'=> 'Users With Shorts',
            'usersWhoHasNoVideo'=> 'Users Without Videos',
            'usersWhoHasAd'=> 'Users With Advertisements',
            'usersWhoHasAdPending'=> 'Users With Pending Advertisements',
            'usersWhoHasAdRunning'=> 'Users With Running Advertisements',
            'usersWhoHasAdStop'=> 'Users With Completed Advertisements',
        ];
    }

    public function scopeSelectedUsers($query) {
        return $query->whereIn('id', request()->user ?? []);
    }

    public function scopeAllUsers($query) {
        return $query;
    }

    public function scopeEmptyBalanceUsers($query) {
        return $query->where('balance', '<=', 0);
    }

    public function scopeTwoFaDisableUsers($query) {
        return $query->where('ts', Status::DISABLE);
    }

    public function scopeTwoFaEnableUsers($query) {
        return $query->where('ts', Status::ENABLE);
    }

    public function scopeHasDepositedUsers($query) {
        return $query->whereHas('deposits', function ($deposit) {
            $deposit->successful();
        });
    }

    public function scopeNotDepositedUsers($query) {
        return $query->whereDoesntHave('deposits', function ($q) {
            $q->successful();
        });
    }

    public function scopePendingDepositedUsers($query) {
        return $query->whereHas('deposits', function ($deposit) {
            $deposit->pending();
        });
    }

    public function scopeRejectedDepositedUsers($query) {
        return $query->whereHas('deposits', function ($deposit) {
            $deposit->rejected();
        });
    }

    public function scopeTopDepositedUsers($query) {
        return $query->whereHas('deposits', function ($deposit) {
            $deposit->successful();
        })->withSum(['deposits' => function ($q) {
            $q->successful();
        }], 'amount')->orderBy('deposits_sum_amount', 'desc')->take(request()->number_of_top_deposited_user ?? 10);
    }

    public function scopeHasWithdrawUsers($query) {
        return $query->whereHas('withdrawals', function ($q) {
            $q->approved();
        });
    }

    public function scopePendingWithdrawUsers($query) {
        return $query->whereHas('withdrawals', function ($q) {
            $q->pending();
        });
    }

    public function scopeRejectedWithdrawUsers($query) {
        return $query->whereHas('withdrawals', function ($q) {
            $q->rejected();
        });
    }

    public function scopePendingTicketUser($query) {
        return $query->whereHas('tickets', function ($q) {
            $q->whereIn('status', [Status::TICKET_OPEN, Status::TICKET_REPLY]);
        });
    }

    public function scopeClosedTicketUser($query) {
        return $query->whereHas('tickets', function ($q) {
            $q->where('status', Status::TICKET_CLOSE);
        });
    }

    public function scopeAnswerTicketUser($query) {
        return $query->whereHas('tickets', function ($q) {

            $q->where('status', Status::TICKET_ANSWER);
        });
    }

    public function scopeNotLoginUsers($query) {
        return $query->whereDoesntHave('loginLogs', function ($q) {
            $q->whereDate('created_at', '>=', now()->subDays(request()->number_of_days ?? 10));
        });
    }

    public function scopeKycVerified($query) {
        return $query->where('kv', Status::KYC_VERIFIED);
    }

    public function scopeAdvertiserUser($query) {
        return $query->where('advertiser_status', Status::YES);
    }
    
    public function scopeUsersWhoHasVideo($query) {
        return $query->whereHas('Videos', function ($q) {
            $q->published();
        });
    }

    public function scopeUsersWhoHasShorts($query) {
        return $query->whereHas('Videos', function ($q) {
            $q->published()->shorts();
        });
    }
    

    public function scopeUsersWhoHasRegulerVideos($query) {
        return $query->whereHas('Videos', function ($q) {
            $q->published()->regular();
        });
    }
    

    public function scopeUsersWhoHasNoVideo($query) {
        return $query->whereDoesntHave('Videos');
    }


    public function scopeUsersWhoHasAd($query) {
        return $query->whereHas('advertisements');
    }


    
    public function scopeUsersWhoHasAdPending($query) {
        return $query->whereHas('advertisements', function ($q) {
            $q->pending();
        });
    }


    public function scopeUsersWhoHasAdRunning($query) {
        return $query->whereHas('advertisements', function ($q) {
            $q->running();
        });
    }

    public function scopeUsersWhoHasAdStop($query) {
        return $query->whereHas('advertisements', function ($q) {
            $q->stop();
        });
    }

}
