<?php
declare(strict_types=1);

require_once __DIR__ . '/../config/helpers.php';
require_once __DIR__ . '/../config/corrida_ofertas_helpers.php';

$data = input_json();
require_fields($data, ['id_corrida', 'id_motorista', 'nota']);

$idCorrida = (int) $data['id_corrida'];
$idMotorista = (int) $data['id_motorista'];
$nota = (int) $data['nota'];
$comentario = trim((string) ($data['comentario'] ?? ''));

if ($idCorrida <= 0 || $idMotorista <= 0) {
    json_fail('Dados invalidos para avaliar passageiro.');
}

if ($nota < 1 || $nota > 5) {
    json_fail('A nota deve ser entre 1 e 5.');
}

try {
    $pdo = db();
    if (!corrida_schema_column_exists($pdo, 'corridas', 'avaliacao_passageiro')) {
        json_fail('Atualize o banco de dados antes de avaliar passageiro.', 500);
    }

    $pdo->beginTransaction();

    $stmt = $pdo->prepare(
        'SELECT id, id_passageiro, id_motorista, status, avaliacao_passageiro
         FROM corridas
         WHERE id = ?
         LIMIT 1
         FOR UPDATE'
    );
    $stmt->execute([$idCorrida]);
    $corrida = $stmt->fetch();

    if (!$corrida) {
        $pdo->rollBack();
        json_fail('Corrida nao encontrada.', 404);
    }

    if ((int) ($corrida['id_motorista'] ?? 0) !== $idMotorista) {
        $pdo->rollBack();
        json_fail('Essa corrida nao pertence a este motorista.', 403);
    }

    if (($corrida['status'] ?? '') !== 'finalizada') {
        $pdo->rollBack();
        json_fail('A corrida ainda nao foi finalizada.', 409);
    }

    if ($corrida['avaliacao_passageiro'] !== null) {
        $pdo->commit();
        json_ok(['already_avaliada' => true]);
    }

    $up = $pdo->prepare(
        'UPDATE corridas
         SET avaliacao_passageiro = ?,
             avaliacao_passageiro_comentario = ?,
             passageiro_avaliado_em = NOW()
         WHERE id = ?'
    );
    $up->execute([$nota, $comentario === '' ? null : $comentario, $idCorrida]);

    if (corrida_table_exists($pdo, 'usuario_feedbacks')) {
        $tipo = $nota >= 5 ? 'elogio' : ($nota <= 3 ? 'reclamacao' : 'observacao');
        $texto = $comentario !== ''
            ? $comentario
            : ($nota >= 5 ? 'Passageiro bem avaliado pelo motorista.' : 'Avaliacao do passageiro registrada pelo motorista.');
        $feedback = $pdo->prepare(
            'INSERT INTO usuario_feedbacks
                (id_usuario, id_corrida, tipo, origem, nota, comentario, registrado_por)
             VALUES (?, ?, ?, "motorista", ?, ?, ?)'
        );
        $feedback->execute([
            (int) $corrida['id_passageiro'],
            $idCorrida,
            $tipo,
            $nota,
            $texto,
            'motorista:' . $idMotorista,
        ]);
    }

    $pdo->commit();
    json_ok(['avaliada' => true]);
} catch (Throwable $e) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    json_fail('Erro ao salvar avaliacao do passageiro.', 500, ['error' => $e->getMessage()]);
}
