<?php
// public/api/openai_key.php
// Endpoint pro cliente da Prospect:
//   - GET  ?action=status   → retorna se tem chave cadastrada (mascarada)
//   - POST action=test      → testa uma chave com a OpenAI
//   - POST action=save      → salva a chave no auth_users (testa antes)
//   - POST action=delete    → remove a chave

define('BASE_PATH', dirname(__DIR__, 2));
require_once BASE_PATH . '/app/config.php';
require_once BASE_PATH . '/app/db.php';
require_once BASE_PATH . '/app/csrf.php';
require_once BASE_PATH . '/app/ai_settings.php';

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

function jexit(array $payload, int $status = 200) {
    http_response_code($status);
    echo json_encode($payload, JSON_UNESCAPED_UNICODE);
    exit;
}

// Sessão
if (empty($_SESSION['user']['id']) || empty($_SESSION['user']['email'])) {
    jexit(['ok' => false, 'error' => 'não autenticado'], 401);
}

$USER_ID = (string)$_SESSION['user']['id'];
$EMAIL   = (string)$_SESSION['user']['email'];

// Lê body JSON ou GET
function readBody(): array {
    $raw = file_get_contents('php://input');
    $j = json_decode($raw, true);
    return is_array($j) ? $j : [];
}

function mask_key(string $key): string {
    if ($key === '') return '';
    $len = strlen($key);
    if ($len <= 12) return str_repeat('•', $len);
    return substr($key, 0, 7) . '••••••' . substr($key, -4);
}

function test_openai_key(string $apiKey): array {
    if (!preg_match('/^sk-[A-Za-z0-9_\-]{20,}$/', $apiKey)) {
        return ['ok' => false, 'error' => 'Formato inválido (deve começar com sk-)'];
    }

    $ch = curl_init('https://api.openai.com/v1/models');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . $apiKey,
            'Content-Type: application/json',
        ],
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_SSL_VERIFYPEER => true,
    ]);
    $resp = curl_exec($ch);
    $code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $err  = curl_error($ch);
    curl_close($ch);

    if ($err) return ['ok' => false, 'error' => 'Conexão com OpenAI: ' . $err];
    if ($code === 401) return ['ok' => false, 'error' => 'Chave inválida ou revogada'];
    if ($code !== 200) {
        $body = json_decode($resp, true);
        return ['ok' => false, 'error' => $body['error']['message'] ?? "HTTP $code"];
    }
    return ['ok' => true];
}

$action = $_GET['action'] ?? '';

try {
    $pdo = db();

    switch ($action) {

        case 'status': {
            // Retorna se cliente tem chave + se deve mostrar o campo
            $st = $pdo->prepare("SELECT openai_api_key FROM public.auth_users WHERE id = :id LIMIT 1");
            $st->execute([':id' => $USER_ID]);
            $key = trim((string)$st->fetchColumn());

            jexit([
                'ok'              => true,
                'should_show'     => ai_client_must_provide_key(),
                'has_key'         => $key !== '',
                'key_masked'      => $key !== '' ? mask_key($key) : null,
            ]);
        }

        case 'test': {
            $data = readBody();
            $token = $data['csrf_token'] ?? '';
            if (!csrf_verify($token)) jexit(['ok' => false, 'error' => 'CSRF inválido'], 403);

            $key = trim((string)($data['api_key'] ?? ''));
            if ($key === '') jexit(['ok' => false, 'error' => 'Informe a chave'], 400);

            $r = test_openai_key($key);
            if (!$r['ok']) jexit(['ok' => false, 'error' => $r['error']], 400);

            jexit(['ok' => true, 'message' => 'Chave válida!']);
        }

        case 'save': {
            // Só permite salvar se modo for "client"
            if (!ai_client_must_provide_key()) {
                jexit(['ok' => false, 'error' => 'No momento o admin é quem está pagando os tokens. Você não precisa configurar.'], 400);
            }

            $data = readBody();
            $token = $data['csrf_token'] ?? '';
            if (!csrf_verify($token)) jexit(['ok' => false, 'error' => 'CSRF inválido'], 403);

            $key = trim((string)($data['api_key'] ?? ''));
            if ($key === '') jexit(['ok' => false, 'error' => 'Informe a chave'], 400);

            // Testa antes de salvar
            $r = test_openai_key($key);
            if (!$r['ok']) jexit(['ok' => false, 'error' => 'Chave inválida: ' . $r['error']], 400);

            // Salva
            $up = $pdo->prepare("UPDATE public.auth_users SET openai_api_key = :k WHERE id = :id");
            $up->execute([':k' => $key, ':id' => $USER_ID]);

            jexit([
                'ok'         => true,
                'message'    => '✓ Chave salva e validada com sucesso',
                'key_masked' => mask_key($key),
            ]);
        }

        case 'delete': {
            $data = readBody();
            $token = $data['csrf_token'] ?? '';
            if (!csrf_verify($token)) jexit(['ok' => false, 'error' => 'CSRF inválido'], 403);

            $up = $pdo->prepare("UPDATE public.auth_users SET openai_api_key = NULL WHERE id = :id");
            $up->execute([':id' => $USER_ID]);

            jexit(['ok' => true, 'message' => 'Chave removida']);
        }

        default:
            jexit(['ok' => false, 'error' => 'Ação inválida'], 400);
    }

} catch (Throwable $e) {
    error_log('openai_key error: ' . $e->getMessage());
    jexit(['ok' => false, 'error' => 'Erro interno: ' . $e->getMessage()], 500);
}