<?php

namespace App\Http\Controllers\Api;

use App\Facades\Services\UserService;
use App\Http\Controllers\Controller;
use App\Http\Requests\UserLogin;
use App\Http\Requests\UserRegister;
use App\Libs\Transformers\UserTransformer;
use Spatie\Fractal\Facades\Fractal;

class AuthController extends Controller
{
    /**
     * Registers a user
     *
     * @param  UserRegister  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function register(UserRegister $request)
    {
        $data = $request->validated();

        $user = UserService::create($data['name'], $data['email'], $data['password']);

        return response()->json(["success" => true]);
    }

    /**
     * Validates user email (double opt-in)
     *
     * @param  string  $code
     * @return \Illuminate\Http\JsonResponse
     */
    public function validateUserEmail(string $code)
    {
        $user = UserService::validateEmail($code);

        $jwtToken = UserService::loginByUser($user);

        return response()->json($this->jwtTokenResponse($jwtToken));
    }

    /**
     * Login a user
     *
     * @param  UserLogin  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(UserLogin $request)
    {
        $data = $request->validated();
        $jwtToken = UserService::loginByCredentials($data['email'], $data['password']);
        return response()->json($this->jwtTokenResponse($jwtToken));
    }

    /**
     * Gets Logged user
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        $user = UserService::getLoggedUser();

        return response()->json(
            Fractal::item($user)->transformWith(new UserTransformer())->toArray()
        );
    }

    /**
     * Returns the JWTToken GraphQL response
     *
     * @param $token
     * @return array
     */
    protected function jwtTokenResponse($token)
    {
        return [
            'token' => $token,
            'type' => 'bearer',
            'expires_in' => auth('api')->factory()->getTTL() * 60
        ];
    }
}
