<?php

namespace App\Http\Controllers;

use App\Http\Resources\UserResource;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $v = validator($request->all(), [
            'first_name' => 'required|string|regex:/^([А-Я][А-Яа-я]*)$/u',
            'last_name' => 'required|string|regex:/^([А-Я][А-Яа-я]*)$/u',
            'patronymic' => 'string|regex:/^([А-Я][А-Яа-я]*)$/u',
            'avatar' => 'image|mimes:png,jpg,jpeg|max:4096',
            'email' => 'required|string|email|unique:users',
            'password' => 'required|string|min:3'
        ]);

        if ($v->fails()) return $this->error($v->errors(), 'Validation failed');

        $data = $v->validated();

        $password = $data['password'];

        if (!preg_match('/[A-ZА-Я]/', $password))
            return $this->error(['password' => ['Пароль должен содержать минимум 1 прописную букву']], 'Validation failed');
        if (!preg_match('/[a-zа-я]/', $password))
            return $this->error(['password' => ['Пароль должен содержать минимум 1 строчную букву']], 'Validation failed');
        if (!preg_match('/\d/', $password))
            return $this->error(['password' => ['Пароль должен содержать минимум 1 цифру']], 'Validation failed');

        $avatar = $request->file('avatar');
        if ($avatar) {
            $filename = Str::random() . '.' . $avatar->getClientOriginalExtension();
            $avatar->move(public_path('images'), $filename);
            $data['avatar'] = url('/images/' . $filename);
        } else {
            unset($data['avatar']);
        }

        $user = User::query()->create($data);

        return $this->success(new UserResource($user), 'Successfully registered');
    }

    public function login(Request $request)
    {
        $v = validator($request->all(), [
            'email' => 'required|string|email|exists:users',
            'password' => 'required|string'
        ]);

        if ($v->fails()) return $this->error($v->errors(), 'Validation failed');

        if (!Auth::attempt($v->validated())) return $this->error(message: 'Login failed', status: 401);

        $user = Auth::user();
        $token = Str::random();
        $user->update(compact('token'));

        return $this->success([
            'profile' => new UserResource($user),
            'credentials' => compact('token')
        ], 'Successfully logged in!');
    }

    public function logout()
    {
        Auth::user()->update(['token' => null]);
        return $this->success(message: 'Successfully logged out!');
    }
}
