<?php

namespace App\Http\Controllers;

use App\AppBlocks;
use App\iSession;
use App\Jobs\NewMemberInit;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Yajny\Controller\BrandCtrl;
use Yajny\Controller\CategoryCtrl;
use Yajny\Controller\CouponCtrl;
use Yajny\Controller\StoreCtrl;
use Yajny\MailYj\Mails\VerifyEmail;
use Yajny\MailYj\Mails\WelcomeVerifiedUser;
use Yajny\Member\Models\BonusType;
use Yajny\Member\Models\Currencies;
use Yajny\Member\Models\Member;
use Yajny\Member\Models\NewBonusType;
use Yajny\Models\Ad;
use Yajny\Models\Country;
use Yajny\Models\Coupon;
use Yajny\Models\Event;
use Yajny\Models\FaqCategories;
use Yajny\Models\Faqs;
use Yajny\Models\FeaturedStores;
use Yajny\Models\PageWidget;
use Yajny\Models\Position;
use Yajny\Models\Region;
use Yajny\Models\Store;
use Yajny\Models\StoreCashback;
use Yajny\Models\StoreCategories;

class GuestController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    public function UserBonuses(){
        $bonusType=[];
        $bonusType['not_finished']=NewBonusType::where('is_referral',0)->get();
        return $bonusType;
    }
    public function PopularStores(){

        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        return ['popular_stores' => $this->getPopularStores($regionCode??"global")];
    }
    public function FeaturedStoreOfTheWeek(){
        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        $query = FeaturedStores::selectRaw(FeaturedStores::colSelect())
            ->with(['Store' => function ($q) {
                $q->selectRaw(Store::colSelect())
                    ->withCount('store_coupons')
                    ->with('store_coupons');
            }])
            ->where('status', 'active');

        if ($regionCode and $regionCode!="global") {
            $query->whereJsonContains('region_code', $regionCode);
        }
        $res = $query->get();
        return $res;
    }
    public function StoresOffers(){
        return ['store_offers'=>$this->getOffersOftheMoment()->take(4)];
    }
    public function HomeSlider()
    {
        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        if ($regionCode=="global"){
            $positions = Position::getByLabelwithoutRegion('discovery')->map(function ($position) {
                return Position::mapItemsForApp($position);
            });
            $featureds = Position::getFeaturedByLabelwithoutRegion('discovery','mobile_discovery_main_featured');

        }else{
            $positions = Position::getByLabel('discovery',$regionCode)->map(function ($position) {
                return Position::mapItemsForApp($position);
            });
            $featureds = Position::getFeaturedByLabel('discovery',$regionCode,'mobile_discovery_main_featured');
        }
        $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);
                    }
            }
        }
        if ($sliders!=null){
            if (count($sliders)==2){
                return ['slider' => [$sliders[0],$sliders[1]]];
            }elseif (count($sliders)==1){
                return ['slider' => [$sliders[0]]];
            }
          else{
              return ['slider' => $sliders];
            }
        }else{
            return ['slider' => $sliders ?? null];
        }


    }
    public function Ads(){
        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        if ($regionCode=="global"){
            $featureds = Position::getFeaturedByLabelwithoutRegion('discovery','mobile_discovery_main_featured');
            return ['ads' => $featureds];

        }else{
            $featureds = Position::getFeaturedByLabel('discovery', $regionCode,'mobile_discovery_main_featured');
            return ['ads' => [$featureds[0]]];
        }

    }
    public function Categories(){
        return ['categories' => $this->getCategories()["all_categories"] ?? null];
    }
    public function Help(){
        return FaqCategories::with(['faqs' => function ($q) {
            $q->selectRaw(Faqs::colSelect())->orderBy('sort_order', 'ASC');
        }])->selectRaw(FaqCategories::colSelect())->orderBy('sort_order', 'ASC')->get();
    }
    public function CashbackSlider(){
        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        if ($regionCode=="global"){
            $positions = Position::getByLabelwithoutRegion('discovery')->map(function ($position) {
                return Position::mapItemsForApp($position);
            });
        }else{
            $positions = Position::getByLabel('discovery',$regionCode)->map(function ($position) {
                return Position::mapItemsForApp($position);
            });
        }
        $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);
                }
        }
        if ($sliders!=null){
            if (count($sliders)==2){
                return ['slider' => [$sliders[0],$sliders[1]]];
            }elseif (count($sliders)==1){
                return ['slider' => [$sliders[0]]];
            }
            else{
                return ['slider' => $sliders];
            }
        }else{
            return ['slider' => $sliders ?? null];
        }
    }

    public function FeaturedStores(){
        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        if ($regionCode=="global"){
            $featureds = Position::getFeaturedByLabelwithoutRegion('discovery','mobile_discovery_cashback_featured');
        }else{
            $featureds = Position::getFeaturedByLabel('discovery', $regionCode,'mobile_discovery_cashback_featured');
        }
        return ["Featured_Stores"=>$featureds];
    }

    public function TopCashbackStores(){
        $topStoresByCashback = $this->getTopCashbackStores(null, 5);
        return ["Top_Cashback_Stores"=>$topStoresByCashback];
    }
    public function RecentStores(){
        return ["Recent_Stores"=>$this->getRecentlyAddedStores(6)];
    }
    public function Stores(){

        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        if ($regionCode=="global"){
            $AllStores=$this->getStoreswithoutRegion(request('filter'),request('category'));

        }else {


            $AllStores = $this->getStores(request('filter'), $regionCode, request('category'));
        }
        foreach ($AllStores as $store){
            $store->coupons=$store->store_coupons_count;

        }
        return ['all_stores'=>$AllStores];


    }
    /**
     * @param $store_id
     * @return array
     */
    public function StoreDetails($store_id)
    {
        $region = \request()->headers->get("region")??"global";
        if ($region=="global"){
        $store = Store::where('id', $store_id)->orWhere('slug', $store_id)->with([
            'store_cashback' => function ($q) {
                return $q->selectRaw(StoreCashback::colSelect());
            },
            'store_coupons' => function ($q)  {

                return $q->selectRaw(Coupon::colSelect());
            },
            'store_offers' => function ($q)  {
                return $q->selectRaw(Coupon::colSelect());
            }
        ])->first();
        }else{
            $store = Store::where('id', $store_id)->orWhere('slug', $store_id)->with([
                'store_cashback' => function ($q) {
                    return $q->selectRaw(StoreCashback::colSelect());
                },
                'store_coupons' => function ($q) use ($region) {
                    if ($region)
                        $q->whereJsonContains('region_code', $region);
                    return $q->selectRaw(Coupon::colSelect());
                },
                'store_offers' => function ($q) use ($region) {
                    if ($region)
                        $q->whereJsonContains('region_code', $region);
                    return $q->selectRaw(Coupon::colSelect());
                }
            ])->first();
        }

        if (!$store)
            abort(404);

        if ($region)
            $store->replaceStoreContent($region);

        $storeCashback = $store->store_cashback;
        $storeCoupons = $store->store_coupons->map(function ($item) {
            return Coupon::mapItems($item, false);
        });
        $storeOffers = $store->store_offers->map(function ($item) {
            return Coupon::mapItems($item, false);
        });

        if ($store->related_stores) {
            $relatedStoresIDs = json_decode($store->related_stores, true);
            $relatedStores = StoreCtrl::getStoresById($relatedStoresIDs)->map(function ($item) {
                return Store::mapItems($item);
            });
        } else {
            $relatedStores = StoreCtrl::getTopStores(request('user_id'))
                ->filter(function ($item) use ($store) {
                    return $store->id != $item->id;
                })
                ->values()
                ->map(function ($item) {
                    return Store::mapItems($item);
                });
        }

        if (!$store->header_image || strlen($store->header_image) <= 1)
            $store->header_image = config('settingConfig.deafult_banner_image');

        unset($store->store_cashback);
        unset($store->store_coupons);
        unset($store->store_offers);

        return [
            'store_details' => $store,
            'store_cashback' => $storeCashback,
            'store_coupons' => $storeCoupons,
            'store_offers' => $storeOffers,
            'related_stores' => $relatedStores
        ];
    }
    public function CouponSlider()
    {
        $regionCode = \request()->headers->get("region") ?? "global";
        if ($regionCode == "global"){
            $positions = Position::getByLabelwithoutRegion('discovery')->map(function ($position) {
                return Position::mapItemsForApp($position);
            });
        }else{
            $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);
            }
        }
        if ($sliders!=null){
            if (count($sliders)==2){
                return ['slider' => [$sliders[0],$sliders[1]]];
            }elseif (count($sliders)==1){
                return ['slider' => [$sliders[0]]];
            }
            else{
                return ['slider' => $sliders];
            }
        }else{
            return ['slider' => $sliders ?? null];
        }
    }
    public function CouponTopSlider()
    {
        $regionCode = \request()->headers->get("region") ?? "global";
        if ($regionCode == "global"){
            $positions = Position::getByLabelwithoutRegion('slide')->map(function ($position) {
                return Position::mapItemsForApp($position);
            });
        }else{
            $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);
            }
        }
        if ($sliders!=null){
            if (count($sliders)==2){
                return ['slider' => [$sliders[0],$sliders[1]]];
            }elseif (count($sliders)==1){
                return ['slider' => [$sliders[0]]];
            }
            else{
                return ['slider' => $sliders];
            }
        }else{
            return ['slider' => $sliders ?? null];
        }
    }
    public function FeaturedCoupons(){
        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        if ($regionCode=="global"){
            $featureds = Position::getFeaturedByLabelwithoutRegion('discovery','mobile_discovery_coupons_featured');
        }else{
            $featureds = Position::getFeaturedByLabel('discovery',$regionCode,'mobile_discovery_coupons_featured');
        }
        $featured_coupons=[];
        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',$regionCode)->get()));
            array_push($featured_coupons,$coupon);
        }
        return ['featured_coupons'=>$featured_coupons];
    }
    public function TopCoupons(){
        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        $topCoupons = $this->getTopCoupons($regionCode,5);
        foreach ($topCoupons as $coupon){
            $coupon->store_coupons_count=count(Coupon::where('store_id',$coupon->store_id)
                ->where("status",'publish')
                ->where("type",'coupon')
                ->whereJsonContains('region_code',$regionCode)
                ->get());
        }
        return ['top_coupons'=>$topCoupons];
    }
    public static function getTopCoupons($region, $limit, $type = "coupon")
    {
        $query = Coupon::with(['couponStore' => function ($q) {
            $q->selectRaw(Store::colSelect());
        }])
            ->where('status', 'publish')
            ->orderBy('clicks', 'DESC')
            ->limit($limit)
            ->selectRaw(Coupon::colSelect());

        if ($type)
            $query->where('type', $type);

        if ($region and $region!="global") {
            $query->whereJsonContains('region_code', $region);
        }
        return $query->get();
    }

    public function ExclusiveCoupons(){
        $region = \request()->headers->get("region")??"global";
        $ExclusiveCoupons= $this->getExclusiveCoupons($region,5,"coupon");
        foreach ($ExclusiveCoupons 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 ['exclusive_coupons'=>$ExclusiveCoupons];
    }
    public  function getExclusiveCoupons($region, $limit , $type){
        $query = Coupon::with(['couponStore' => function ($q) {
            $q->selectRaw(Store::colSelect());
        }])
            ->where('status', 'publish')
            ->where('is_exclusive', 1)
            ->orderBy('updated_at','DESC')
            ->limit($limit)
            ->selectRaw(Coupon::colSelect());

        if ($type)
            $query->where('type', $type);
        if ($region and $region!="global") {
            $query->whereJsonContains('region_code', $region);
        }


        CouponCtrl::applyRegions($query);
        return $query->get();
    }
    public function RecentlyAddedCoupons(){

        $region = \request()->headers->get("region")??"global";
        $recentlyAddCoupons = CouponCtrl::getRecentlyAddCoupons(null,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];
    }

    public function getAllCoupons()
    {
        $regionCode = request()->headers->get("region") ? request()->headers->get("region") : "global" ;
        $coupons=$this->getAppCouponsByTypewithPagination('coupon',$regionCode)->map(function ($item) {
            return Coupon::mapItems($item);
        });
        $AllCoupons=[];
        foreach ($coupons as $coupon){
            $coupon['highlight_title1']=DB::table('coupons')->where('id',$coupon['id'])->first()->highlight_title1;
            $coupon['highlight_title2']=DB::table('coupons')->where('id',$coupon['id'])->first()->highlight_title2;
            $coupon['store_coupons_count']=count(Coupon::where('store_id',$coupon['store_id'])
                ->where("status",'publish')
                ->where("type",'coupon')
                ->get());
            $coupon['code']=$coupon['coupon_code'];
            array_push($AllCoupons,$coupon);
        }
        return ['coupons'=>$AllCoupons];
    }
    public  function getAppCouponsByTypewithPagination($type = null,$region=null)
    {
        $query = Coupon::with(['couponStore' => function ($q) {
            $q->selectRaw(Store::colSelect());
        }])
            ->where('status', 'publish')
            ->orderBy('clicks', 'DESC')
            ->limit(25)
            ->selectRaw(Coupon::colSelect());

        if ($type)
            $query->where('type', $type)
                ->paginate(10);
        if ($region and $region!="global")
            $query->whereJsonContains('region_code', $region);
        return $query->get();
    }
    public function StoreInfo($store_id){
        return StoreCtrl::getInfo($store_id);
    }
    /**
     * @return mixed
     */
    public function getStores($filter=null,$region='global',$category=0)
    {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);
        }
    }
        if ($screen=="cb"){
            $storesQuery->where('cb_status','>',0)
                ->where('current_cb','!=',null);
        }
        if ($screen=="cp"){
            $storesQuery->where('cb_coupon','>',0);
        }
        return $storesQuery->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 getStoreswithoutRegion($filter=null,$category=0)
    {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('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);
        }
    }
        if ($screen=="cb"){
            $storesQuery->where('cb_status','>',0)
                ->where('current_cb','!=',null);
        }
        if ($screen=="cp"){
            $storesQuery->where('cb_coupon','>',0);
        }
        return $storesQuery->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);
    }
    /**
     * @param int $limit
     * @return mixed
     */
    private function getRecentlyAddedStores($limit = 4)
    {
        return StoreCtrl::getRecentStores($limit)->map(function ($item) {
            return Store::mapItems($item);
        });
    }
    /**
     * @return \Illuminate\Support\Collection
     */
    private function getTopCashbackStores($user_id, $limit)
    {

        return StoreCtrl::getTopStoresByCashback($user_id, $limit)->map(function ($item) {
            return Store::mapItems($item);

        });
    }
    /**
     * @return \Illuminate\Support\Collection
     */
    private function getPopularStores($region='global',$limit = 6 )
    {
        if ($region != 'global'){
        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) use ($region) {

                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
                ];
            });
        }else{
            return StoreCtrl::getStoresByIdWithCategory(
                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\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Coupon[]
     */
    private function getOffersOftheMoment()
    {
        $offerQuery = Coupon::with(['couponStore' => function ($q) {
            $q->selectRaw(Store::colSelect());
        }])
            ->where('type', 'offer')
            ->where('is_featured', 0)
            ->where('is_recommended', 0)
            ->orderBy('updated_at', 'DESC')
            ->selectRaw(Coupon::colSelect());
        CouponCtrl::applyRegions($offerQuery);
        return $offerQuery->get();
    }
    /**
     * @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);
                })
        ];
    }

}
