<?php

namespace App\Http\Controllers;

use Illuminate\Support\Collection;
use Yajny\Controller\StoreCtrl;
use Yajny\Models\Ad;
use Yajny\Models\Coupon;
use Yajny\Models\Position;
use Yajny\Models\Store;
use Yajny\Models\StoreCashback;
use Faker\Generator as Faker;


class StoreController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */

    // Check favorate { Store, Category, coupon }
    /**
     * @return mixed
     */
    public function getAllStores()
    {
        return StoreCtrl::getStores();
    }

    /** Get Store By Category **/
    public function getStoresByCat($cat_id)
    {

        return StoreCtrl::getStoresByCategory($cat_id);
    }

    /**
     * @param $store_id
     * @return mixed
     */
    public function getStoreInfo($store_id)
    {
        return StoreCtrl::getInfo($store_id);
    }

    /**
     * @param $store_id
     * @return mixed
     */
    public function getExtStore($store_id)
    {
        $store = Store::withoutGlobalScope('status')->select('id', 'name', 'ext_info', 'domain_name', 'checkout_url')
            //->with('coupons')
            ->with(['coupons' => function ($q) {
                $q->select('id', 'code', 'store_id')->whereNotNull('code');
            }])
            ->find($store_id);

        if ($store) {
            $store->ext_info = json_decode($store->ext_info);
            $store->applicableCoupons = array_unique($store->coupons->map(function ($coupon) {
                return $coupon->code;
            })->toArray());
            unset($store->coupons);
        }

        return $store;
    }

    /**
     * @return array
     */
    public function getTopStores()
    {
        $regionCode = request('region');
        $storeIDs = array_merge(
            config('settingConfig.hp_new_top_stores_top_row')[$regionCode ?? 'global'] ?? [],
            explode(',', config('settingConfig.hp_top_stores'))
        );
        if ($regionCode=="global"){
        $recommendedStores = StoreCtrl::getTopStoreswithoutRegion(request('user_id'), 5)->map(function ($item) {
            return Store::mapItems($item);
        });
        }else{
            $recommendedStores = StoreCtrl::getTopStores(request('user_id'), 5)->map(function ($item) {
                return Store::mapItems($item);
            });
        }
        $storeWithCategoriesIds = explode(',', config('settingConfig.top_stores_' . ($regionCode ?? 'global')));
        if ($storeWithCategoriesIds[0] != '')
            $storeWithCategories = StoreCtrl::getStoresWithCategoriesByID($storeWithCategoriesIds)->values();
        else
            $storeWithCategories = new Collection();
        $storeWithoutCategories = StoreCtrl::getStoresWithCategoriesByID($storeIDs)
            ->sortByDesc('current_cb')->filter(function ($store) {
                return $store->store_cashback->count() < 5;
            })->take(5)->values();
        $positions = Position::getByLabel('top_stores', $regionCode)->map(function ($position) {
            return Position::mapItemsForApp($position);
        });

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

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

        return [
            'positions' => $positions,
            'slider' => ($sliders && count($sliders) > 0) ? $sliders[0] : null, // todo remove after force update app
            'recommended_stores' => $recommendedStores,
            'stores_without_categories' => $storeWithoutCategories,
            'stores_with_categories' => $storeWithCategories,
        ];
    }

    /**
     * @param Faker $faker
     * @return array
     */
    public function getFeaturedStoresOfTheWeek()
    {
        $regionCode = request('region');
        if ($regionCode=="global") {
            $recommendedStores = StoreCtrl::getTopStoreswithoutRegion(request('user_id'), 1)->map(function ($item) {
                $region = request('region');
                $images = [
                    "https://ae01.alicdn.com/kf/H18ee9703f34147f496d734cd5df003fco/-.jpg_300x300.jpg_.webp",
                    "https://ae01.alicdn.com/kf/Ha74de322107e42b798bd0d7c015e5e5c5/-.jpg_300x300.jpg_.webp",
                    "https://ae01.alicdn.com/kf/H18ee9703f34147f496d734cd5df003fco/-.jpg_300x300.jpg_.webp",
                    "https://ae01.alicdn.com/kf/He2f7727f948947fbba7258d5396947487/-.jpg_300x300.jpg_.webp",
                ];
                    $item->with([
                        'store_coupons' => function ($q) use ($region) {
                            if ($region != "global")
                                $q->whereJsonContains('region_code', $region);
                            return $q->selectRaw(Coupon::colSelect());
                        }
                    ])->first();
                $itm = Store::mapItems($item);

                $itm['store_coupons'] = $item->store_coupons->map(function ($item) {
                    return Coupon::mapItems($item, false);
                });
                $itm['photos'] = $images;
                $itm['description'] = 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Maxime mollitia,
molestiae quas vel sint commodi repudiandae consequuntur voluptatum laborum
numquam blanditiis harum quisquam eius sed odit fugiat iusto fuga praesentium
optio, eaque rerum! Provident similique accusantium nemo autem.';
                return $itm;
            });
        }else{
            $recommendedStores = StoreCtrl::getTopStores(request('user_id'), 1)->map(function ($item) {
                $region = request('region');
                $images = [
                    "https://ae01.alicdn.com/kf/H18ee9703f34147f496d734cd5df003fco/-.jpg_300x300.jpg_.webp",
                    "https://ae01.alicdn.com/kf/Ha74de322107e42b798bd0d7c015e5e5c5/-.jpg_300x300.jpg_.webp",
                    "https://ae01.alicdn.com/kf/H18ee9703f34147f496d734cd5df003fco/-.jpg_300x300.jpg_.webp",
                    "https://ae01.alicdn.com/kf/He2f7727f948947fbba7258d5396947487/-.jpg_300x300.jpg_.webp",
                ];
                $item->with([
                    'store_coupons' => function ($q)  {

                        return $q->selectRaw(Coupon::colSelect());
                    }
                ])->first();
                $itm = Store::mapItems($item);

                $itm['store_coupons'] = $item->store_coupons->map(function ($item) {
                    return Coupon::mapItems($item, false);
                });
                $itm['photos'] = $images;
                $itm['description'] = 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Maxime mollitia,
molestiae quas vel sint commodi repudiandae consequuntur voluptatum laborum
numquam blanditiis harum quisquam eius sed odit fugiat iusto fuga praesentium
optio, eaque rerum! Provident similique accusantium nemo autem.';
                return $itm;
            });

        }

        return ['stores' => $recommendedStores];
    }

    /**
     * @param $store_id
     * @return array
     */
    public function getStoreDetails($store_id)
    {
        $region = request('region');
        if ($region=="global") $region="gb";
        $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 ;
            },
            'store_offers' => function ($q) use ($region) {
                if ($region)
                      $q->whereJsonContains('region_code', $region);
                return    $q ;
            }
        ])->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
        ];
    }
}
