<?php
header('Content-Type: application/json; charset=utf-8');

error_reporting(E_ALL);
ini_set('display_errors', 0);

require dirname(__DIR__) . '/config.php';

function responder($ok, $mensagem, $extra, $status)
{
    http_response_code($status);

    $dados = array(
        'ok' => $ok,
        'mensagem' => $mensagem
    );

    if (!empty($extra) && is_array($extra)) {
        $dados = array_merge($dados, $extra);
    }

    echo json_encode($dados);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    responder(false, 'Use POST.', array(), 405);
}

$usuario = isset($_POST['usuario']) ? trim($_POST['usuario']) : '';
$senha   = isset($_POST['senha']) ? (string)$_POST['senha'] : '';
$token   = isset($_POST['token']) ? trim($_POST['token']) : '';
$nome    = isset($_POST['nome']) ? trim($_POST['nome']) : '';

if ($usuario === '' || $senha === '') {
    responder(false, 'Informe usuario e senha.', array(), 400);
}

if ($token === '' || !preg_match('/^[a-f0-9]{64}$/i', $token)) {
    responder(false, 'Token invalido.', array(), 400);
}

if ($nome === '') {
    $nome = 'Celular';
}

if (strlen($nome) > 120) {
    $nome = substr($nome, 0, 120);
}

try {

    /* ---------------------------------------------------------
       1) AUTENTICA O USUÁRIO
    --------------------------------------------------------- */
    $stmt = $pdo->prepare(
        'SELECT id, nome, usuario, senha_hash, perfil, ativo
         FROM usuarios_localizacao
         WHERE usuario = ?
         LIMIT 1'
    );

    $stmt->execute(array($usuario));

    $u = $stmt->fetch();

    if (!$u) {
        responder(false, 'Usuario ou senha invalidos.', array(), 401);
    }

    if ((int)$u['ativo'] !== 1) {
        responder(false, 'Usuario inativo.', array(), 403);
    }

    if (!password_verify($senha, $u['senha_hash'])) {
        responder(false, 'Usuario ou senha invalidos.', array(), 401);
    }

    if ($u['perfil'] !== 'USUARIO' && $u['perfil'] !== 'ADMIN') {
        responder(false, 'Perfil de usuario invalido.', array(), 403);
    }

    $usuarioId = (int)$u['id'];

    /* ---------------------------------------------------------
       2) LOCALIZA O APARELHO PELO TOKEN
    --------------------------------------------------------- */
    $stmt = $pdo->prepare(
        'SELECT id, usuario_id
         FROM dispositivos
         WHERE token = ?
         LIMIT 1'
    );

    $stmt->execute(array($token));

    $dispositivo = $stmt->fetch();

    if ($dispositivo) {

        $dispositivoId = (int)$dispositivo['id'];
        $usuarioAtualId = isset($dispositivo['usuario_id'])
            ? (int)$dispositivo['usuario_id']
            : 0;

        /*
         * Segurança:
         * se o aparelho já estiver vinculado a outro usuário,
         * não permite trocar silenciosamente pelo aplicativo.
         * O administrador deverá desvincular primeiro.
         */
        if ($usuarioAtualId > 0 && $usuarioAtualId !== $usuarioId) {
            responder(
                false,
                'Este aparelho ja esta vinculado a outra conta. Procure o administrador.',
                array(),
                409
            );
        }

        $stmt = $pdo->prepare(
            'UPDATE dispositivos
             SET usuario_id = ?,
                 nome = ?,
                 ativo = 1,
                 compartilhamento_ativo = 1
             WHERE id = ?'
        );

        $stmt->execute(
            array(
                $usuarioId,
                $nome,
                $dispositivoId
            )
        );

    } else {

        /* -----------------------------------------------------
           3) CADASTRA E JÁ VINCULA O NOVO APARELHO
        ----------------------------------------------------- */
        $stmt = $pdo->prepare(
            'INSERT INTO dispositivos
            (
                usuario_id,
                nome,
                token,
                ativo,
                compartilhamento_ativo,
                criado_em
            )
            VALUES
            (?, ?, ?, 1, 1, NOW())'
        );

        $stmt->execute(
            array(
                $usuarioId,
                $nome,
                $token
            )
        );

        $dispositivoId = (int)$pdo->lastInsertId();
    }

    responder(
        true,
        'Login realizado e aparelho vinculado com sucesso.',
        array(
            'usuario_id' => $usuarioId,
            'usuario_nome' => $u['nome'],
            'usuario_login' => $u['usuario'],
            'perfil' => $u['perfil'],
            'dispositivo_id' => $dispositivoId,
            'dispositivo_nome' => $nome
        ),
        200
    );

} catch (Exception $e) {

    responder(
        false,
        'Erro interno ao vincular o aparelho.',
        array(),
        500
    );
}
