<?php

namespace App\Http\Controllers;

use App\Models\Settings;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Yajny\Controller\CouponCtrl;
use Illuminate\Http\Request;
use Yajny\Member\Models\Member;
use Yajny\Models\Ad;
use Yajny\Models\CategoryCoupon;
use Yajny\Models\Coupon;
use Yajny\Models\Store;
use Yajny\Models\Position;

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

    public function index($data = null)
    {
        $CouponCtrl = new CouponCtrl;
        $hot_deal = $CouponCtrl->getHomepageCoupons();

        $featured_deal = $CouponCtrl->getHomepageCoupons();

        return ['hotDeals' => $hot_deal, 'featuredDeals' => $featured_deal];
    }

    public function storePage($store_id)
    {
        $CouponCtrl = new CouponCtrl;
        return ['hotDeals' => $CouponCtrl->getCouponsByStore($store_id)];
    }

    public function brandPage($brand_id)
    {

        $CouponCtrl = new CouponCtrl;
        return ['hotDeals' => $CouponCtrl->getCouponsByBrands($brand_id)];
    }

    public function filerCoupon(Request $request)
    {
        // post all the filter values as an array
        // die(print_r($_POST));

        $stores = isset($request->store) ? $request->store : [];
        $cats   = isset($request->category) ? $request->category : [];
        $brands = isset($request->brand) ? $request->brand : [];
        $tags   = isset($request->tag) ? $request->tag : [];
        $type   = isset($request->type) ? $request->type : [];
        $page   = isset($request->page) ? $request->page : 1;

        return CouponCtrl::filterCoupon($stores, $cats, $brands, $tags, $type, $limit = 30, $page);
    }

    public function favouriteCoupon(Request $req)
    {

        $favs = ['store' => [], 'coupon' => [], 'brand' => [], 'tag' => [], 'cat' => []];
        $CouponCtrl = new CouponCtrl;
        $data = $CouponCtrl->getFavourite_coupons( $req->get('user_id'));

        foreach ($data as  $fav)
            $favs[$fav->fav_object] =  array_map('intval', explode(',', $fav->list));


        return $favs;
    }

    public function getPopularCoupons($cat_id) {
        return CouponCtrl::getHomepageCoupons($cat_id);
    }

    public function getAllCoupons()
    {

        $regionCode = request()->header("region")??"global";
        if ($regionCode=="global"){
            $coupons=CouponCtrl::getAppCouponsByTypewithPaginationwithoutRegion('coupon')->map(function ($item) {
                return Coupon::mapItems($item);
            });
        }else{
            $coupons=CouponCtrl::getAppCouponsByTypewithPagination('coupon')->map(function ($item) {
                return Coupon::mapItems($item);
            });
        }

        $AllCoupons=[];
        foreach ($coupons as $coupon){
            $coupon['highlight_title1']=json_decode(DB::table('coupons')->where('id',$coupon['id'])->first()->highlight_title1);
            $coupon['highlight_title2']=json_decode(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 getAllExclusiveCoupons(Request $request)
    {
        $regionCode = request('region')??"global";
        $cat_id= $request->categorie??0;
        $query = Coupon::with(['couponStore' => function ($q) {
            $q->selectRaw(Store::colSelect());
        }])
            ->where('type',"coupon")
            ->where("is_exclusive",true)
            ->where('status', 'publish')
            ->orderBy('clicks', 'DESC')
            ->selectRaw(Coupon::colSelect());


        if ($cat_id > 0)
            $query->whereJsonContains('cats', $cat_id);
        if ($regionCode and $regionCode!="global")
            $query->whereJsonContains('region_code', $regionCode);
        $query->paginate(10);
        $coupons=$query->get();

        $AllCoupons=[];
        foreach ($coupons as $coupon){
            $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 getCouponCategories()
    {
        $regionCode = request('region');
        $couponCategories =CategoryCoupon::whereNull('parent_id')->get()->map(function ($item) {
            return CategoryCoupon::mapItems($item);
        });
        return ["couponCategories"=>$couponCategories
        ];
    }



    public static function getCouponsByType($type = null, $cat_id = 0)
    {

        $query = Coupon::where('status', 'publish')
            ->whereRaw('created_at > DATE_SUB(CURRENT_DATE, INTERVAL 90 DAY)  ')
            ->orderBy('clicks', 'DESC')
        ;
        if ($type)
            $query->where('type', $type);

        CouponCtrl::applyRegions($query);
        return $query->get();
    }
    public function getCouponSlider()
    {
        $regionCode = request('region');
        $positions = Position::getByLabel('coupons', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        });

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

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

    }

    public function getRecentCoupons()
    {
        $regionCode = request('region');
        return ["recentCoupons"=> CouponCtrl::getRecentCouponsByTypewithpagination('coupon')->map(function ($item) {
            return Coupon::mapItems($item);
        })
        ];

    }
    public function getadsPositions()
    {
        $regionCode = request('region');
        $positions = Position::getByLabel('coupons', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        });

        $adsPositions = $positions->filter(function ($position) {
            return $position['type'] == 'ads';
        });
        return ["adsPositions"=>$adsPositions];

    }
    public function getPositions()
    {
        $regionCode = request('region');
        return ["positions"=>
        Position::getByLabel('coupons', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        })
        ];

    }

    public function getCouponsData()
    {
        $regionCode = request('region');
        $coupons = CouponCtrl::getAppCouponsByType('coupon')->map(function ($item) {
            return Coupon::mapItems($item);
        });
        $couponCategories = CategoryCoupon::whereNull('parent_id')
            ->selectRaw(CategoryCoupon::colSelect())
            ->get();

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

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

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

        $couponSliders = $sliders; // todo remove after force update app

        $recentCoupons = CouponCtrl::getRecentCouponsByType('coupon')->map(function ($item) {
            return Coupon::mapItems($item);
        });

        foreach ($couponCategories as $index => $couponCategory) {
            $categoryCoupons = CouponCtrl::getTopCouponsByType('coupon', $couponCategory->id);
            if ($categoryCoupons->count() < 6) {
                unset($couponCategories[$index]);
                continue;
            }
            $couponCategory->coupons = $categoryCoupons->map(function ($item) {
                return Coupon::mapItems($item);
            });
        }

        $couponCategories = $couponCategories->values();

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

        $adsPositions = $positions->filter(function ($position) {
            return $position['type'] == 'ads';
        });

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

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

        $couponSliders = $sliders; // todo remove after force update app
        return compact('coupons', 'couponCategories', 'couponSliders', 'recentCoupons', 'adsPositions', 'positions');
    }

    public function getCouponCategoryData($cat_id) {

        return CouponCtrl::getCouponsByType('coupon', $cat_id);
    }


    /**
     * @param Request $request
     * @param $cat_id
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Coupon[]
     */
    public function getCouponCategoryDataWithPagination(Request $request ,$cat_id='all',$page='all', $limit=15 ) {


        if (request()->headers->get('region') and !empty(request()->headers->get('region'))){
            $region= request()->headers->get('region');
        }else{
            if ($request->user_id){
                $region = Member::find($request->user_id)->region_code;
                if ($region=="" or !$region)
                    $region= 'global';
            }
        }
        $query=  Coupon::with(['couponStore' => function ($q) {
           $q->selectRaw(Store::colSelect());
       }])
           ->where('status', 'publish')
           ->orderBy('clicks', 'DESC')
           ->where('type', "coupon");
        if ($region and $region!="global")
            $query->whereJsonContains("region_code", $region);
        if($limit && $page!='all')
            $query->limit($limit)->offset(($page - 1) * $limit);
        if ($cat_id > 0)
            CouponCtrl::applyConditions($query, [], [$cat_id], [], []);


        $listcoupons = $query->get();
        $sponsoredcoupons=[];
        foreach ($listcoupons as  $coupon){

            $coupon['store_coupons_count'] =count(Coupon::where('store_id',intval($coupon['store_id']))
                ->where("status",'publish')
                ->where("type",'coupon')
                ->whereJsonContains('region_code', $region ?? 'global')->get());


            $sponsoredcoupons[]=$coupon;
        }
        return $sponsoredcoupons;
    }

    /**
     * @param Request $request
     * @param $cat_id
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Coupon[]
     */
    public function  CouponCategoryDataWithPagination(Request $request ,$cat_id ) {

       $page= $request->page ?? 'all';
       $limit= $request->limit ?? 15;

        if ($request->hasHeader('region')) {
            $region= $request->region;
        }else{
            $region= 'global';
        }
        $regionCode= $region ?? 'global';
       // dd($page,$limit, $cat_id);
       $listcoupons=  CouponCtrl::listCouponsByType('coupon',$cat_id, $limit,$page)->map(function ($item) {
                return Coupon::mapItems($item,true);
       });

        $sponsoredcoupons=[];
        foreach ($listcoupons as  $coupon){

            $coupon['store_coupons_count'] =count(Coupon::where('store_id',intval($coupon['store_id']))
                ->where("status",'publish')
                ->where("type",'coupon')
                ->whereJsonContains('region_code', $regionCode ?? 'global')->get());


            $sponsoredcoupons[]=$coupon;
        }
        return $sponsoredcoupons;
    }

    /**
     * @param Request $request
     */
    public function getSponsorCoupons(Request $request) {


        if ($request->hasHeader('region')) {
            $region= $request->region;
        }else{
            $region= 'global';
        }
        $regionCode= $region ?? 'global';
        $key='Sponsor_blackfriday_bloc_1_'.$regionCode;
        $settings = Settings::getByKey($key);

        $listCouponsIds= (empty($settings->setting_value)) ? []:explode(',',$settings->setting_value);

        $sponsored_coupons= Coupon::with(['couponStore' => function ($q) use ($regionCode) {
            $q->selectRaw(Store::colSelect())  ;
        }])->whereIn('id',$listCouponsIds)->orderBy('clicks', 'DESC')->get()->map(function ($item) {
            return Coupon::mapItems($item);
        });


        $sponsoredcoupons=[];
        foreach ($sponsored_coupons as  $coupon){

            $coupon['store_coupons_count'] =count(Coupon::where('store_id',intval($coupon['store_id']))
                ->where("status",'publish')
                ->where("type",'coupon')
                ->whereJsonContains('region_code', $regionCode ?? 'global')->get());


            $sponsoredcoupons[]=$coupon;
        }
       return $sponsoredcoupons;
    }

}
