<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Yajny\Controller\CouponCtrl;
use Yajny\Member\Models\UserFavourite;
class UserFavoritesController extends MemberController
{
    /**
     * @var string
     */
    public static $FAV_OBJECT_TYPE_STORE = 'store';
    /**
     * @var string
     */
    public static $FAV_OBJECT_TYPE_CATEGORY = 'category';
    /**
     * @var string
     */
    public static $FAV_OBJECT_TYPE_COUPON = 'coupon';
    /**
     * @var string
     */
    public static $FAV_OBJECT_TYPE_BRAND = 'brand';
    /**
     * @var array
     */
    protected $available_types;
    /**
     * @param Request $request
     */
    public function __construct(Request $request)
    {
        parent::__construct($request);
        $this->available_types = [
            self::$FAV_OBJECT_TYPE_STORE,
            self::$FAV_OBJECT_TYPE_CATEGORY,
            self::$FAV_OBJECT_TYPE_COUPON,
            self::$FAV_OBJECT_TYPE_BRAND
        ];
    }
    /**
     * @param Request $request
     * @return array
     * @throws \Exception
     */
    public function toggleUserMultiFavourites(Request $request)
    {
        Validator::make($request->all(), [
            'action' => 'required|in:add,remove',
            'fav_object' => 'required|in:' . implode(',', $this->available_types),
            'object_id' => 'required|array',
            'object_id.*' => 'required|integer|distinct',
        ])->validate();
        foreach ($request->object_id as $object_id) {
            $fav_record = $this->member->favourites()->where('fav_object', $request->fav_object)->where('object_id', $object_id)->first();
            if ($request->action == 'add') {
                if ($fav_record) {
                    $status = 'already added';
                } else {
                    $this->member->favourites()->save(new UserFavourite(['fav_object' => $request->fav_object, 'object_id' => $object_id]));
                    $status = 'added';
                }
            } else {
                if ($fav_record) {
                    $fav_record->delete();
                    $status = 'removed';
                } else {
                    $status = 'already removed';
                }
            }
        }

        $signin=  ($request->signin==1) ?? true;
        if ($signin && $status=='added'){
            $this->member->end_signin_process=1;
            $this->member->save();
        };


        return [
            'status' => $status,
            'list' => $this->getUserFavourites()
        ];
    }

    /**
     * @param Request $request
     * @return array
     * @throws \Exception
     */
    public function toggleUserFavourites(Request $request)
    {
        Validator::make($request->all(), [
            'action' => 'required|in:add,remove',
            'fav_object' => 'required|in:' . implode(',', $this->available_types),
            'object_id' => 'required|integer'
        ])->validate();

        $fav_record = $this->member->favourites()->where('fav_object', $request->fav_object)->where('object_id', $request->object_id)->first();
        if ($request->action == 'add') {
            if ($fav_record) {
                $status = 'already added';
            } else {
                $this->member->favourites()->save(new UserFavourite(['fav_object' => $request->fav_object, 'object_id' => $request->object_id]));
                $status = 'added';
            }
        }
        else {
            if ($fav_record) {
                $fav_record->delete();
                $status = 'removed';
            } else {
                $status = 'already removed';
            }
        }




        return [
            'status' => $status,
            'list' => $this->getUserFavourites()
        ];
    }


    /**
     * @param Request $request
     * @return array
     */
    public function getLastCouponsFromFavorites(Request $request)
    {
        $region=$request->region;
        $limit= ($request->limit) ?? 8;

        $favStores= UserFavourite::getUserFavoritesGrouped($this->user_id);
        $lastcoupons=null;
        if($favStores['store']){
        if ($region=="global"){
            $lastcoupons =CouponCtrl::getLastCouponsByFavObjectwithoutRegion($favStores['store'],$limit,'') ;
        }else{
            $lastcoupons =CouponCtrl::getLastCouponsByFavObject($favStores['store'],$limit,'') ;

        }
        }

       return ["fav_stores"=>$favStores['store'],"last_coupons"=> json_decode($lastcoupons)] ;
    }
    /**
     * @return array
     */
    public function getUserFavourites()
    {
        return UserFavourite::getUserFavoritesGrouped($this->user_id);
    }
}
