<?php


namespace App\Repositories;


use App\Models\User;
use App\UsersRecipes;
use Carbon\Carbon;

class UsersRepository implements UsersRepositoryInterface
{
    public function getAll()
    {
        return User::all();
    }

    public function paginate($chunkSize)
    {
        return User::paginate($chunkSize);
    }

    public function create($data)
    {
        return User::create($data);
    }

    public function delete($id)
    {
        $user = User::find($id);
        return $user->delete();
    }

    public function getById($id)
    {
        $user = User::find($id);
        return $user;
    }

    public function getWhereEquals($field, $actual)
    {
        return User::where($field, $actual);
    }

    public function saveRecipe(int $userID, int $recipeID)
    {
        return UsersRecipes::create(['user_id' => $userID, 'recipe_id' => $recipeID]);
    }

    public function getRecipeHistory(int $userID, string $groupBy = 'day')
    {
        $userRecipes = UsersRecipes::where('user_id', $userID)->orderByDesc('created_at')->get();
        $recipeHistory = [];
        if ($groupBy == 'month') {
            $userRecipes = $userRecipes->groupBy(function ($d) {
                return Carbon::parse($d->created_at)->format('Y-m');
            });
        } else {
            $userRecipes = $userRecipes->groupBy(function ($d) {
                return Carbon::parse($d->created_at)->format('Y-m-d');
            });
        }

        foreach ($userRecipes as $date => $dateRecipes) {
            $nutritionSum  = [
                'kcal' => 0,
                'carbohydrates' => 0,
                'protein' => 0,
                'fat' => 0,
            ];

            foreach($dateRecipes as $userRecipe){
                $nutritionValues = $userRecipe->recipe->nutrition;
                foreach($nutritionValues as $name => $value){
                    $nutritionSum[$name] += $value;
                }
            }

            foreach($nutritionSum as $k => $v){
                $nutritionSum[$k] = round($v, 2);
            }

            $recipeHistory[] = array_merge(['date' => $date], $nutritionSum);
        }

        return $recipeHistory;
    }
}