<?php

namespace App\Http\Controllers;

use AltThree\Segment\Segment;
use App\Http\Controllers\Auto\CashbackController;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
use PHPUnit\Exception;
use Yajny\Controller\CategoryCtrl;
use Yajny\Controller\CouponCtrl;
use Yajny\Controller\StoreCtrl;
use Yajny\EventsYj\Listeners\CashbackConfirmed;
use Yajny\Member\Models\Click;
use Yajny\Member\Models\Member;
use Yajny\Member\Models\UserSales;
use Yajny\Models\Ad;
use Yajny\Models\Store;
use Yajny\Models\Coupon;
use Yajny\Models\PageWidget;
use Yajny\Models\Position;
use Yajny\Models\StoreCategories;
use function MongoDB\BSON\toJSON;

class DiscoveryController extends Controller
{
    /**
     * @return array
     */
    public function getMainSlider()
    {
        $regionCode = request('region');
        $user_id = request('user_id');
        $member = null;
        if ($user_id)
            $member = Member::find($user_id);
        if (empty($regionCode))
            $regionCode=$member->region_code;
        if ($regionCode=="global"){
            $positions = Position::getByLabel('discovery',$regionCode)->map(function ($position) {
                return Position::mapItemsForApp($position);
            });
            $featureds = Position::getFeaturedByLabel('discovery',$regionCode,'mobile_discovery_main_featured');
            $OffersOfTheMoments = $this->getOffersOftheMoment()->take(4);
            $sliders = null;
            if (count($positions)==0 or $positions==null)
                $positions = Position::getByLabelwithoutRegion('discovery')->map(function ($position) {
                    return Position::mapItemsForApp($position);
                });

            if (!isset($featureds) or count($featureds)==0 or $featureds==null)
                $featureds = Position::getFeaturedByLabelwithoutRegion('discovery','mobile_discovery_main_featured');

            if(!empty($positions)){
                if (isset($positions['mobile_discovery_main'])) {
                    $sliders = $positions['mobile_discovery_main']['ads']->toArray();

                    foreach ($sliders as $index => $ad) {
                        $sliders[$index] = Ad::fixSliderAppLinKForOldVersion($ad);
                    }
                }
            }
        }else{
        $positions = Position::getByLabel('discovery',$regionCode )->map(function ($position) {
            return Position::mapItemsForApp($position);
        });
        $featureds = Position::getFeaturedByLabel('discovery', $regionCode,'mobile_discovery_main_featured');

        $OffersOfTheMoments = $this->getOffersOftheMoment()->take(4);
        $sliders = null;
        if(!empty($positions)){
            if (isset($positions['mobile_discovery_main'])) {
                $sliders = $positions['mobile_discovery_main']['ads']->toArray();

                foreach ($sliders as $index => $ad) {
                    $sliders[$index] = Ad::fixSliderAppLinKForOldVersion($ad);
                }
            }
        }
        }
        return ['slider' => $sliders ?? null];
    }
    /**
     * @return array
     */
    public function getMainPopularStores()
    {
        $regionCode = request('region');
        $user_id = request('user_id');
        if (empty($regionCode))
            $regionCode=Member::find($user_id)->region_code;
        return ['popular_stores' => $this->getPopularStores($regionCode)];
    }
    /**
     * @return array
     */
    public function getMainAds()
    {
        $regionCode = request('region');
        $user_id = request('user_id');
        $featureds = Position::getFeaturedByLabel('discovery', $regionCode,'mobile_discovery_main_featured');
        return ['ads' => $featureds];
    }
    /**
     * @return array
     */
    public function getMainStoresOffers()
    {
        $regionCode = request('region');
        return ['store_offers'=>$this->getOffersOftheMoment()->take(4)];
    }
    /**
     * @return array
     */
    public function getMainCategories()
    {
        return ['categories' => $this->getCategories()["all_categories"] ?? null];
    }
    /**
     * @return array
     */
    public function getMainBalance()
    {
        $user_id = request('user_id');
        $member = null;
        if ($user_id)
            $member = Member::find($user_id);
        if ($member) {
            $memberCurrency = $member->getUserCurrency();
            $balance = $member->is_merchant ? 0 : ($member->pending_balance + $member->confirmed_balance);
            return ["balance"=>[
                'value' => round($balance * $memberCurrency->conversion_rate, 2),
                'value_formatted' => $this->currencyValueFormatted($balance * $memberCurrency->conversion_rate, $memberCurrency)
            ]];
        }else{
            return ["balance"=>[]];
        }
    }
    // refactored function

    /**
     * @return array
     */
    public function getMainData()
    {
        $regionCode = request('region');
        $user_id = request('user_id');
        $member = null;
        if ($user_id)
            $member = Member::find($user_id);
        if (empty($regionCode))
            $regionCode=$member->region_code;
        $positions = Position::getByLabel('discovery', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        });
        $featureds = Position::getFeaturedByLabel('discovery', $regionCode,'mobile_discovery_main_featured');

        $OffersOfTheMoments = $this->getOffersOftheMoment()->take(4);
        $sliders = null;
        if(!empty($positions)){
            if (isset($positions['mobile_discovery_main'])) {
                $sliders = $positions['mobile_discovery_main']['ads']->toArray();

                foreach ($sliders as $index => $ad) {
                    $sliders[$index] = Ad::fixSliderAppLinKForOldVersion($ad);
                }
            }
        }
        $homeReturn = [
            'slider' => $sliders ?? null,
            'popular_stores' => $this->getPopularStores($regionCode),
            'ads' => $featureds,
            'store_offers' =>$OffersOfTheMoments ,
            'categories' => $this->getCategories()["all_categories"] ?? null,

        ];

        if ($member) {
            $memberCurrency = $member->getUserCurrency();
            $balance = $member->is_merchant ? 0 : ($member->pending_balance + $member->confirmed_balance);
            $homeReturn['balance'] = [
                'value' => round($balance * $memberCurrency->conversion_rate, 2),
                'value_formatted' => $this->currencyValueFormatted($balance * $memberCurrency->conversion_rate, $memberCurrency)
            ];
        }

        return $homeReturn;
    }

    /**
     * @return array
     */
    public function getCashbackData()
    {

        $regionCode = request('region');
        $user_id = request('user_id');

        $member = null;
        if ($user_id)
            $member = Member::find($user_id);

        $positions = Position::getByLabel('discovery', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        });
        $topStoresByCashback = $this->getTopCashbackStores($user_id, 5);

        // todo remove after force update app
        $sliders = null;
        if (isset($positions['mobile_discovery_cashback'])) {
            $sliders = $positions['mobile_discovery_cashback']['ads']->toArray();

            foreach ($sliders as $index => $ad) {
                $sliders[$index] = Ad::fixSliderAppLinKForOldVersion($ad);
            }
        }

        $recommendedStores = StoreCtrl::getTopStores(request('user_id'), 12)->map(function ($item) {
            return Store::mapItems($item);
        });

        $featureds = Position::getFeaturedByLabel('discovery', $regionCode,'mobile_discovery_cashback_featured');

        $homeReturn = [
            'slider' => $sliders ?? null,
            'top_cashback_stores' => $topStoresByCashback,
            'recent_stores' => $this->getRecentlyAddedStores(6),
            'featured_stores' => $featureds,
            'all_store' => $this->getAllStoreswithoutpagination(),
            'recommended_stores' => $recommendedStores

        ];

        if ($member) {
            $memberCurrency = $member->getUserCurrency();
            $balance = $member->is_merchant ? 0 : ($member->pending_balance + $member->confirmed_balance);
            $homeReturn['balance'] = [
                'value' => round($balance * $memberCurrency->conversion_rate, 2),
                'value_formatted' => $this->currencyValueFormatted($balance * $memberCurrency->conversion_rate, $memberCurrency)
            ];
        }

        return $homeReturn;
    }
    /**
     * @return array
     */
    public function getCashbackSlider()
    {
        $regionCode = request('region');
        $user_id = request('user_id');

        $member = null;
        if ($user_id)
            $member = Member::find($user_id);

        $positions = Position::getByLabel('discovery', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        });

        // todo remove after force update app
        $sliders = null;
        if (isset($positions['mobile_discovery_cashback'])) {
            $sliders = $positions['mobile_discovery_cashback']['ads']->toArray();

            foreach ($sliders as $index => $ad) {
                $sliders[$index] = Ad::fixSliderAppLinKForOldVersion($ad);
            }
        }
        return ['slider' => $sliders ?? null];
    }
    /**
     * @return array
     */
    public function getCashbackTopCashbackStores()
    {
        $regionCode = request('region');
        $user_id = request('user_id');
        $topStoresByCashback = $this->getTopCashbackStores($user_id, 5,$regionCode);
        return ["Top_Cashback_Stores"=>$topStoresByCashback];
    }
    /**
     * @return array
     */
    public function getCashbackRecentStores()
    {
        $Recent_Stores=[];
        $recentStores=$this->getRecentlyAddedStores(50);
        foreach ($recentStores as $store){
            if (count($Recent_Stores)<6)
                array_push($Recent_Stores,$store);
        }

        return ["Recent_Stores"=>$Recent_Stores];
    }
    /**
     * @return array
     */
    public function getCashbackFeaturedStores()
    {
        $regionCode = request('region');
        if ($regionCode=="global"){
            $featureds = Position::getFeaturedByLabel('discovery',$regionCode,'mobile_discovery_cashback_featured');
            if (!isset($featureds) or count($featureds)==0 or $featureds==null)
                $featureds = Position::getFeaturedByLabelwithoutRegion('discovery','mobile_discovery_cashback_featured');

        }else{
            $featureds = Position::getFeaturedByLabel('discovery', $regionCode,'mobile_discovery_cashback_featured');

        }
        return ["Featured_Stores"=>$featureds];
    }
    /**
     * @return array
     */
    public function getCashbackAllStores()
    {
        return ['all_stores'=>$this->getAllStores()];
    }
    /**
     * @return array
     */
    public function getCashbackRecommendedStores()
    {
        $recommendedStores = StoreCtrl::getTopStores(request('user_id'), 12)->map(function ($item) {
            return Store::mapItems($item);
        });
        return ["Recommended_Stores"=>$recommendedStores];
    }
    /**
     * @return array
     */
    public function getCashbackBalance()
    {
        $user_id = request('user_id');
        $member = null;
        if ($user_id)
            $member = Member::find($user_id);
        if ($member) {
            $memberCurrency = $member->getUserCurrency();
            $balance = $member->is_merchant ? 0 : ($member->pending_balance + $member->confirmed_balance);
            return ["balance"=>[
                'value' => round($balance * $memberCurrency->conversion_rate, 2),
                'value_formatted' => $this->currencyValueFormatted($balance * $memberCurrency->conversion_rate, $memberCurrency)
            ]];
        }else{
            return ["balance"=>[]];
        }
    }

    /**
     * @return array
     */
    public function getCouponsSlider()
    {
        $regionCode = request('region');
        $user_id = request('user_id');

        $member = null;
        if ($user_id)
            $member = Member::find($user_id);

        $positions = Position::getByLabel('discovery', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        });
        $sliders = null;
        if (isset($positions['mobile_discovery_coupons'])) {
            $sliders = $positions['mobile_discovery_coupons']['ads']->toArray();

            foreach ($sliders as $index => $ad) {
                $sliders[$index] = Ad::fixSliderAppLinKForOldVersion($ad);
            }
        }
        return ['slider'=>$sliders];

    }
    /**
     * @return array
     */
    public function getCouponsTopSlider()
    {
        $regionCode = request('region');
        $user_id = request('user_id');

        $member = null;
        if ($user_id)
            $member = Member::find($user_id);

        $positions = Position::getByLabel('slide', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        });
        $sliders = null;
        if (isset($positions['top_home_slide'])) {
            $sliders = $positions['top_home_slide']['ads']->toArray();

            foreach ($sliders as $index => $ad) {
                $sliders[$index] = Ad::fixSliderAppLinKForOldVersion($ad);
            }
        }
        return ['slider'=>$sliders];

    }
    /**
     * @return array
     */
    public function getCouponsTopCoupons()
    {
        $regionCode = request('region');
        $user_id = request('user_id');

        $member = null;
        $member = Member::find($user_id);
        if($regionCode=="global"){
            $topCoupons = CouponCtrl::getTopCouponswithoutRegion($user_id,5);
        }else{
            $topCoupons = CouponCtrl::getTopCoupons($user_id,5);
        }
        foreach ($topCoupons as $coupon){
            $coupon->store_coupons_count=count(Coupon::where('store_id',$coupon->store_id)
                ->where("status",'publish')
                ->where("type",'coupon')
                ->get());
        }
        return ['top_coupons'=>$topCoupons];

    }
    /**
     * @return array
     */
    public function getCouponsFeaturedCoupons()
    {
        $regionCode = request()->headers->get('region');
        $user=Member::find(\request('user_id'));
        $featureds = Position::getFeaturedByLabel('discovery', $user->region_code??$regionCode,'mobile_discovery_coupons_featured');
        $featured_coupons=[];
        if ($featureds) {
            foreach ($featureds as $coupon){
                array_push($coupon,$coupon['store_coupons_count']=count(Coupon::where('store_id',intval($coupon['store_id']))
                    ->where("status",'publish')
                    ->where("type",'coupon')
                    ->whereJsonContains('region_code',$user->region_code??$regionCode)->get()));
                array_push($featured_coupons,$coupon);
            }
        }else{
            $featureds = Position::getFeaturedByLabelwithoutRegion('discovery', 'mobile_discovery_coupons_featured');
            foreach ($featureds as $coupon){
                array_push($coupon,$coupon['store_coupons_count']=count(Coupon::where('store_id',intval($coupon['store_id']))
                    ->where("status",'publish')
                    ->where("type",'coupon')
                    ->get()));
                array_push($featured_coupons,$coupon);
            }
        }


        return ['featured_coupons'=>$featured_coupons??null];

    }
    /**
     * @return array
     */
    public function getCouponsRecentlyAddedCoupons()
    {
        $user_id = request('user_id');
        $region=Member::find($user_id)->region_code;
        if ($region=="global"){
            $recentlyAddCoupons = CouponCtrl::getRecentlyAddCouponswithoutRegion($user_id,5,"coupon");

        }else{
            $recentlyAddCoupons = CouponCtrl::getRecentlyAddCoupons($user_id,5,"coupon");

        }
        foreach ($recentlyAddCoupons as $coupon){
            $coupon->store_coupons_count=count(Coupon::where('store_id',$coupon->store_id)->where("status",'publish')
                ->where("type",'coupon')->whereJsonContains('region_code',$region)->get());
        }
        return ['recently_add_coupons'=>$recentlyAddCoupons];

    }
    /**
     * @return array
     */
    public function getCouponsExclusiveCoupons()
    {
        $user_id = request('user_id');
        $regionCode = request('region');
        if($regionCode=="global"){
            $ExclusiveCoupons= CouponCtrl::getExclusiveCouponswithoutRegion($user_id,5,"coupon");
        }else{
            $ExclusiveCoupons= CouponCtrl::getExclusiveCoupons($user_id,5,"coupon");
        }
        foreach ($ExclusiveCoupons as $coupon){
            if($regionCode=="global") {
                $coupon->store_coupons_count = count(Coupon::where('store_id', $coupon->store_id)->where("status", 'publish')
                    ->where("type", 'coupon')->get());
            }else{
                $coupon->store_coupons_count = count(Coupon::where('store_id', $coupon->store_id)->where("status", 'publish')
                    ->where("type", 'coupon')->whereJsonContains('region_code', $regionCode)->get());
            }
        }
        return ['exclusive_coupons'=>$ExclusiveCoupons];

    }
    /**
     * @return array
     */
    public function getCouponsAllStores(Request $request)
    {

        return ['all_stores'=>$this->getAllStores()];

    }
    public function getCouponsStores(Request $request)
    {
        $AllStores=$this->getStores(request('filter'),Member::find(request('user_id'))->region_code??"global",request('category'));
        foreach ($AllStores as $store){
            $store->coupons=$store->store_coupons_count;
        }
        return ['all_stores'=>$AllStores];

    }
    /**
     * @return array
     */
    public function getCouponsBalance()
    {
        $user_id = request('user_id');

        $member = null;
        if ($user_id)
            $member = Member::find($user_id);
        if ($member) {
            $memberCurrency = $member->getUserCurrency();
            $balance = $member->is_merchant ? 0 : ($member->pending_balance + $member->confirmed_balance);
            return ["balance"=>[
                'value' => round($balance * $memberCurrency->conversion_rate, 2),
                'value_formatted' => $this->currencyValueFormatted($balance * $memberCurrency->conversion_rate, $memberCurrency)
            ]];
        }else{
            return ["balance"=>[]];
        }
    }

    /**
     * @return array
     */
    public function getOffersData()
    {
        $topStores = StoreCtrl::getTopStores(request('user_id'));
        return [
            'coupons' => $this->getStoreCoupons($topStores),
            'recommended_deals' => $this->getRecommendedDeals($topStores),
            'all_offers' => $this->getRegularOffers()
        ];
    }
    /**
     * @return array
     */
    //unused function
    public function getCouponsData()
    {
        $regionCode = request('region');
        $user_id = request('user_id');

        $member = null;
        if ($user_id)
            $member = Member::find($user_id);

        $positions = Position::getByLabel('discovery', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        });
        $sliders = null;
        if (isset($positions['mobile_discovery_coupons'])) {
            $sliders = $positions['mobile_discovery_coupons']['ads']->toArray();

            foreach ($sliders as $index => $ad) {
                $sliders[$index] = Ad::fixSliderAppLinKForOldVersion($ad);
            }
        }

        $topCoupons = CouponCtrl::getTopCoupons($user_id,5);

        $recentlyAddCoupons = CouponCtrl::getRecentlyAddCoupons($user_id,5,"coupon");
        $ExclusiveCoupons= CouponCtrl::getExclusiveCoupons($user_id,5,null);

        // todo remove after force update app

        $featureds = Position::getFeaturedByLabel('discovery', $regionCode,'mobile_discovery_coupons_featured');
        $CashbackReturn = [
            'slider' => $sliders ?? null, // todo remove after force update app
            'top_coupons'=> $topCoupons,
            'featured_coupons'=>$featureds,
            'Recently_add_coupons'=>$recentlyAddCoupons,
            'Exclusive_coupons'=>$ExclusiveCoupons,
            'all_store' => $this->getAllStoreswithoutpagination()

        ];
        if ($member) {
            $memberCurrency = $member->getUserCurrency();
            $balance = $member->is_merchant ? 0 : ($member->pending_balance + $member->confirmed_balance);
            $CashbackReturn['balance'] = [
                'value' => round($balance * $memberCurrency->conversion_rate, 2),
                'value_formatted' => $this->currencyValueFormatted($balance * $memberCurrency->conversion_rate, $memberCurrency)
            ];
        }

        return $CashbackReturn;
    }

    /**
     * @return array
     */
    public function getCoupons()
    {
        $topStores = StoreCtrl::getTopStores(request('user_id'));
        return [
            'coupons' => $this->getStoreCoupons($topStores),
        ];
    }
    /**
     * @return array
     */
    public function getOffersRecommendedDeals()
    {
        $topStores = StoreCtrl::getTopStores(request('user_id'));
        return [
            'recommended_deals' => $this->getRecommendedDeals($topStores),
        ];
    }
    /**
     * @return array
     */
    public function getAllOffers()
    {
        $all_offers=[];
        $regionCode = request('region');
        if ($regionCode=="global"){
            $data=$this->getRegularOfferswithoutRegion();
        }else{
            $data=$this->getRegularOffers();
        }
            foreach ($data as $element) {
                if ($element != null)
                    array_push($all_offers, $element);
            }
        return ['all_offers' =>$all_offers];
    }


    /**
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Coupon[]
     */
    public function getHotDeals()
    {
        return CouponCtrl::getHomepageCoupons()->map(function ($item) {
            return Coupon::mapItems($item);
        });
    }

    /**
     * @return mixed
     */
    public function getAllStores($filter=null,$region='global',$category=0)
    {

                return $storesQuery = Store::selectRaw(Store::colSelect())
                    ->withCount('store_coupons')
                    ->addSelect('clicks')
                    ->orderBy('slug',"ASC")
                    ->paginate(10);

        $storesQuery->sortBy('clicks', [], true);

        return $storesQuery->get()->filter(function ($store) {
            return $store->coupons > 0 || $store->cb_status == 1;
        })->values()->map(function ($item) {
            return Store::mapItems($item);
        });
        return $storesQuery->get()->sortBy('clicks',[],true);

    }
    /**
     * @return mixed
     */
    public function getStores($filter=null,$region='global',$category=0)
    {
        if ($region=="global"){
            if ($category=="0"){
                if ($filter=="az"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('slug',"ASC")
                        ->paginate(10);


                }elseif($filter=="za"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderByDesc('slug')
                        ->paginate(10);
                }
                elseif($filter=="coupons"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('store_coupons_count',"DESC")
                        ->paginate(10);
                }elseif ($filter=="cashback"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->where("cb_status",true)
                        ->orderBy('current_cb',"DESC")
                        ->paginate(10);
                }
                else{
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('clicks',"DESC")
                        ->paginate(10);
                }
            }
            else{
                if ($filter=="az"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('slug',"ASC")
                        ->whereJsonContains('region_code', $region)
                        ->whereJsonContains('categories', $category)
                        ->paginate(10);

                }elseif($filter=="za"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderByDesc('slug')
                        ->whereJsonContains('categories', $category)
                        ->paginate(10);
                }
                elseif($filter=="coupons"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('store_coupons_count',"DESC")
                        ->whereJsonContains('categories', $category)
                        ->paginate(10);

                }elseif ($filter=="cashback"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->where("cb_status",true)
                        ->orderBy('current_cb',"DESC")
                        ->paginate(10);
                }
                else{
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('clicks',"DESC")
                        ->whereJsonContains('categories', $category)
                        ->paginate(10);
                }
            }
        }else{
            if ($category=="0"){
                if ($filter=="az"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('slug',"ASC")
                        ->whereJsonContains('region_code', $region)
                        ->paginate(10);


                }elseif($filter=="za"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderByDesc('slug')
                        ->whereJsonContains('region_code', $region)
                        ->paginate(10);
                }
                elseif($filter=="coupons"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('store_coupons_count',"DESC")
                        ->whereJsonContains('region_code', $region)
                        ->paginate(10);
                }elseif ($filter=="cashback"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->where("cb_status",true)
                        ->orderBy('current_cb',"DESC")
                        ->whereJsonContains('region_code', $region)
                        ->paginate(10);
                }
                else{
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('clicks',"DESC")
                        ->whereJsonContains('region_code', $region)
                        ->paginate(10);
                }
            }
            else{
                if ($filter=="az"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('slug',"ASC")
                        ->whereJsonContains('region_code', $region)
                        ->whereJsonContains('categories', $category)
                        ->paginate(10);

                }elseif($filter=="za"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderByDesc('slug')
                        ->whereJsonContains('region_code', $region)
                        ->whereJsonContains('categories', $category)
                        ->paginate(10);
                }
                elseif($filter=="coupons"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('store_coupons_count',"DESC")
                        ->whereJsonContains('region_code', $region)
                        ->whereJsonContains('categories', $category)
                        ->paginate(10);

                }elseif ($filter=="cashback"){
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->where("cb_status",true)
                        ->orderBy('current_cb',"DESC")
                        ->whereJsonContains('region_code', $region)
                        ->paginate(10);
                }
                else{
                    return $storesQuery = Store::selectRaw(Store::colSelect())
                        ->withCount('store_coupons')
                        ->addSelect('clicks')
                        ->orderBy('clicks',"DESC")
                        ->whereJsonContains('region_code', $region)
                        ->whereJsonContains('categories', $category)
                        ->paginate(10);
                }
            }
        }

        $storesQuery->sortBy('clicks', [], true);

        return $storesQuery->get()->filter(function ($store) {
            return $store->coupons > 0 || $store->cb_status == 1;
        })->values()->map(function ($item) {
            return Store::mapItems($item);
        });
        return $storesQuery->get()->sortBy('clicks',[],true);
    }
    /**
     * @return mixed
     */
    public function getAllStoreswithoutpagination()
    {
        return StoreCtrl::getStores()->map(function ($item) {
            return Store::mapItems($item);
        });
    }

    /**
     * @return array
     */
    public function getCategories()
    {
        $top_store_categories = CategoryCtrl::getTopParentCategories(true);
        $top_store_categories_ids = $top_store_categories->pluck('id')->toArray();

        return [
            'top_categories' => $top_store_categories->map(function ($item) {
                return StoreCategories::mapItems($item);
            }),
            'all_categories' => CategoryCtrl::getParentCategoriesExceptIds($top_store_categories_ids, true)
                ->map(function ($item) {
                    return StoreCategories::mapItems($item);
                })
        ];
    }

    /**
     * @param $value
     * @param $currency_record
     * @return string
     */
    private function currencyValueFormatted($value, $currency_record): string
    {
        $value = round($value, 2);
        $formattedValue = "{$value} {$currency_record->symbol}";
        if ($currency_record->display_as == 'prefix')
            $formattedValue = "{$currency_record->symbol} {$value}";
        return $formattedValue;
    }

    /**
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Coupon[]
     */
    private function getStoreOffers()
    {
        return CouponCtrl::getHomeFeaturedCouponsByType('offer')->map(function ($item) {
            return Coupon::mapItems($item);
        });
    }

    /**
     * @return \Illuminate\Support\Collection
     */
    private function getPopularStores($region='global',$limit = 6 )
    {
        if($region=="global"){
            $region=null;
        }
        return StoreCtrl::getStoresByIdWithCategoryAndRegion(
            explode(',',
                PageWidget::where('for_page', 'homepage')
                    ->where('widget_type', 'StoresGrid')
                    ->first('widget_content')->widget_content),'region_code',$region)
                    ->take($limit)->map(function ($item) {

            return [
                'id' => $item->id,
                'logo' => $item->logo,
                'store_name' =>  ['en'=>$item->name_en,'ar'=>$item->name_ar] ,
                'was_cb' => $item->was_cb,
                'was_cashback_text' => $item->was_cashback_text,
                'current_cb' => $item->current_cb,
                'cashback_text' => $item->cashback_text,
                'cb_status' => $item->cb_status,
                'store_coupons_count' => count(app('App\Http\Controllers\StoreController')->getStoreDetails($item->id)['store_coupons']),
                'is_favourite' => $item->is_favourite
            ];
        });

    }

    /**
     * @return \Illuminate\Support\Collection
     */
    private function getTopCashbackStores($user_id=null, $limit,$region="global")
    {
        if ($region=="global"){
        return StoreCtrl::getTopStoresByCashbackwithoutRegion($user_id, $limit)->map(function ($item) {
            return Store::mapItems($item);
        });
        }else{
            return StoreCtrl::getTopStoresByCashback($user_id, $limit)->map(function ($item) {
                return Store::mapItems($item);
            });
        }

    }
    /**
     * @return \Illuminate\Support\Collection
     */
    private function getHomeFeaturedCoupons( $limit= 4)
    {

        return CouponCtrl::getHomeFeaturedCouponsByType()->map(function ($item) {
            return Coupon::mapItems($item);
        })->take($limit);
    }

    /**
     * @return \Illuminate\Support\Collection
     */
    private function getMostVisitedStores()
    {
        $user = Member::find(request('user_id'));
        $topClickedStoresIDs = $user->clicks()
            ->selectRaw("count('id') as store_count, store_id")
            ->groupBy(['store_id'])
            ->orderByDesc('store_count')
            ->limit(20)
            ->get()
            ->pluck('store_id')
            ->toArray();
        return StoreCtrl::getStoresById($topClickedStoresIDs)->map(function ($item) {
            return Store::mapItems($item);
        });
    }


    /**
     * @param int $limit
     * @return mixed
     */
    private function getRecentlyAddedStores($limit = 4)
    {
        return StoreCtrl::getRecentStoreswithoutRegion($limit)->map(function ($item) {
            return Store::mapItems($item);
        });
    }


    /**
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Coupon[]
     */
    private function getRegularOffers()
    {
        $offerQuery = Coupon::with(['couponStore' => function ($q) {
            $q->selectRaw(Store::colSelect());
        }])
            ->where('type', 'offer')
            ->where('is_featured', 0)
            ->where('is_recommended', 0)
            ->selectRaw(Coupon::colSelect())
            ->orderBy('clicks', 'DESC');
        $offerQuery->paginate(10);
        CouponCtrl::applyRegions($offerQuery);

        return $offerQuery->get()->map(function ($item) {
            if ($item->coupon_store->status=="publish")
            {
                return Coupon::mapItems($item);
            }else{
            }

        });
    }
    /**
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Coupon[]
     */
    private function getRegularOfferswithoutRegion()
    {
        $offerQuery = Coupon::with(['couponStore' => function ($q) {
            $q->selectRaw(Store::colSelect());
        }])
            ->where('type', 'offer')
            ->where('is_featured', 0)
            ->where('is_recommended', 0)
            ->selectRaw(Coupon::colSelect())
            ->orderBy('clicks', 'DESC');
        $offerQuery->paginate(10);
        return $offerQuery->get()->map(function ($item) {
            if ($item->coupon_store->status=="publish")
            {
                return Coupon::mapItems($item);
            }else{
            }
        });
    }
    /**
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Coupon[]
     */
    private function getOffersOftheMoment($region="global")
    {
        $offerQuery = Coupon::with(['couponStore' => function ($q) {
            $q->selectRaw(Store::colSelect());
        }])
            ->where('type', 'offer')
            ->where('is_featured', 0)
            ->where('is_recommended', 0)
            ->selectRaw(Coupon::colSelect())
            ->orderBy('updated_at', 'DESC');

        return $offerQuery->get();
    }


    /**
     * @param $topStores
     * @return \Illuminate\Support\Collection
     */
    private function getRecommendedDeals($topStores, $limit = 5)
    {
        return CouponCtrl::getUserRecommendedCouponsByType('offer', request('region'), $limit, $topStores->pluck('id'), null, true)->map(function ($item) {
            return Coupon::mapItems($item);
        });
    }

    /**
     * @param $topStores
     * @return \Illuminate\Support\Collection
     */
    private function getStoreCoupons($topStores, $limit = 5)
    {
        return CouponCtrl::getUserRecommendedCouponsByType('coupon', request('region'), $limit, $topStores->pluck('id'), null, true)->map(function ($item) {
            return Coupon::mapItems($item);
        });
    }

    private static function applyRegions($storesQuery, $field = 'region_code', $randomOnGlobal = true)
    {
        $regionCode = request('region');

        if ($regionCode) {
            $storesQuery->whereJsonContains("{$field}", $regionCode ?? 'global');
            $storesQuery->orderByRaw("JSON_LENGTH({$field})");
        } elseif ($randomOnGlobal) {
            $storesQuery->inRandomOrder();
        }
    }

    public function Campagne(){
        $id=\request('id');
        $cashback=UserSales::find($id);
        $OrderCampagne=Click::find($cashback->click_id);
        $CampaignInfo=$OrderCampagne->utm;
        $JsonCampaign=json_decode($CampaignInfo);

        $CampaignName =$JsonCampaign->utm_campaign;

        $CampaignData=explode("-",$CampaignName) ;

        \Segment::init("jote3CtGnwkzDnru9uxRmO1nQebH6kl9");
        \Segment::track(array(
            "userId" => $cashback->user_id??"",
            "event" =>"Confirmed Revenue",
            "properties" => array(
                "Order ID"=>$cashback->id??"",
                "Order Cashback"=>$cashback->cashback??"",
                "Click ID"=>$cashback->click_id??"",
                "Source" => $JsonCampaign->utm_source??"",
                "ID" => $CampaignData[0]??"",
                "CampaignName" => $CampaignData[1]??"",
                "Name" => $CampaignData[2]??"",
                "Date" => $CampaignData[3]??""
            )
        ));
        return ("success");

    }
    public function CampagneAPI(Request $request){

            $apiURL = "https://api-stg.yajny.com/app/data?id=".$request->id;
            if (env("APP_ENV")=="production")
                $apiURL = "https://api.yajny.com/app/data";
        $postInput = [
            'id' => $request->id,
        ];
        $client = new \GuzzleHttp\Client();
        $response = $client->request('POST', $apiURL, ['form_params' => $postInput]);
        return ;

    }
    public function zohoAccessToken(Request $request){
        $apiURL="https://accounts.zoho.com/oauth/v2/token?client_id=1000.V0ITC90HZXVSJ3LDG3GKLOQDMDD9WU&client_secret=43fe84963c85101389a1df81f7e1d8da4b7b576005&grant_type=refresh_token&refresh_token=1000.ae6435f603c28db78f7cb41e10d3c987.2dec5363b4cb18e95ed314537100a78e&scope=Desk.tickets.READ%2CDesk.tickets.CREATE%2CDesk.basic.READ%2CDesk.settings.READ";
        $client = new \GuzzleHttp\Client();
        $response = $client->request('POST', $apiURL, []);

        return $response;
    }
}
