<?php

namespace Yajny\Member\Models;

use Illuminate\Database\Eloquent\Model;
use Yajny\Member\Entities\FavouriteTypes;

class UserFavourite extends Model
{
    //
    protected $table = 'user_favs';
    protected $primaryKey = 'id';

    protected $guarded = ['id'];
    public $timestamps = false;
    public static $userFavourites = [];

    public function store()
    {
        return $this->hasOne('Yajny\Models\Store', 'id', 'object_id')->withoutGlobalScopes();
    }

    public function coupon()
    {
        return $this->hasOne('Yajny\Models\Coupon', 'id', 'object_id');
    }


    public function brand()
    {
        return $this->hasOne('Yajny\Models\Brand', 'id', 'object_id');
    }

    public static function isFavourite($userID, $objectType, $objectID)
    {
        if (isset($userID) && !isset(self::$userFavourites[$userID])) {
            self::$userFavourites[$userID] = self::getUserFavoritesGrouped($userID);
            foreach (self::$userFavourites[$userID] as $type => $favourite) {
                self::$userFavourites[$userID][$type] = array_fill_keys($favourite, true);
            }
        }
        return isset(self::$userFavourites[$userID][$objectType][$objectID]);
    }

    public static function getUserFavoritesGrouped($user_id)
    {
        return self::mapGroupedUserFavorites(self::where('user_id', $user_id)
            ->groupBy('fav_object')
            ->selectRaw("fav_object,GROUP_CONCAT(object_id) as list ")
            ->get()
            ->mapWithKeys(function ($favData) {
                return [
                    $favData->fav_object => array_map('intval', explode(',', $favData->list))
                ];
            })
            ->toArray());
    }

    public static function mapGroupedUserFavorites($grouped_items)
    {
        $data = [];
        foreach (FavouriteTypes::getAvailableTypes() as $type)
            $data[$type] = $grouped_items[$type] ?? [];
        return $data;
    }
}
