// src/services/users.service.js
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const config = require('../config');
const usersRepo = require('../repositories/users.repo');
const { httpError } = require('../utils/httpError');

async function login(username, password) {
    if (!username || !password) {
        throw httpError(400, 'Usuário e senha são obrigatórios');
    }

    const user = await usersRepo.findByUsername(username);
    if (!user) throw httpError(401, 'Credenciais inválidas');

    const ok = await bcrypt.compare(password, user.password);
    if (!ok) throw httpError(401, 'Credenciais inválidas');

    const token = jwt.sign({ id: user.id, username: user.username }, config.jwtSecret, {
        expiresIn: '24h',
    });

    return { token };
}

async function register(username, password) {
    if (
        !username ||
        !password ||
        typeof username !== 'string' ||
        typeof password !== 'string' ||
        username.length < 3 ||
        password.length < 4
    ) {
        throw httpError(
            400,
            'Nome de usuário deve ter pelo menos 3 caracteres e senha pelo menos 4 caracteres'
        );
    }

    const existing = await usersRepo.findByUsername(username);
    if (existing) throw httpError(409, 'Nome de usuário já está em uso');

    const hashed = await bcrypt.hash(password, 10);
    const id = await usersRepo.insertUser({ username, passwordHash: hashed });

    const token = jwt.sign({ id, username }, config.jwtSecret, { expiresIn: '24h' });
    return { token };
}

module.exports = { login, register };
