<?php

namespace App\Services;

use App\Models\User;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class UserService
{
    /**
     * Create(register) new user
     * @param array $data This is expected to be validated already
     * @return User
     */
    public function create($data, $autoLogin = true): User
    {
        if (User::where([ 'email' => $data['email'] ])->count() !== 0) {
            throw new HttpResponseException(response()->json('email_taken', 400));
        }

        $data['password'] = Hash::make($data['password']);

        $user = User::create($data);
        if ($autoLogin) {
            Auth::login($user);
        }
        return $user;
    }

    /**
     * Login to user
     * @param array $data This is expected to be validated already
     * @return User
     */
    public function login($data): bool
    {
        if (Auth::attempt($data)) {
            request()->session()->regenerate();
            return true;
        }
        return false;
    }

    public function setPassword($data)
    {
        $user = User::where([ 'email' => $data['email'] ])->first();
        if ($user === null) {
            return;
        }

        $user->password = Hash::make($data['password']);
        $user->save();
    }

    public function listAll(): array
    {
        return User::all()->toArray();
    }

    public function getOneById(string $id): User | null
    {
        return User::where([ 'id' => $id ])->first();
    }

    /**
     * Will return `null` if failed
     */
    public function editUser(array $data, string $id): User | null
    {
        $user = $this->getOneById($id);
        if ($user === null) {
            return null;
        }

        if (array_key_exists('password', $data)) {
            $this->setPassword([ 'email' => $user['email'], 'password' => $data['password'] ]);
        }

        $user->fill($data['user']);
        $user->save();
        return $user;
    }
}