<?php
declare(strict_types=1);

require_once __DIR__ . '/../../includes/bootstrap.php';
require_once __DIR__ . '/../../includes/CaseResults.php';

dbnToolsRequireMethod('POST');
dbnToolsRequireAuth();

if (!dbnToolsIsFreeTier()) {
    dbnToolsError('Saved analyses are SSO-only.', 403, 'sso_only');
}

$userId = (int)($_SESSION['dbn_tools_sso_uid'] ?? 0);
if ($userId <= 0) {
    dbnToolsError('Missing user id.', 401, 'no_user');
}

if (!CaseResults::isEnabled($userId)) {
    dbnToolsError('Saving results requires a Plus or Pro plan.', 403, 'not_paid');
}

$input         = dbnToolsJsonInput(800000);
$tool          = (string)($input['tool']          ?? '');
$title         = mb_substr(trim((string)($input['title'] ?? '')), 0, 200, 'UTF-8');
$inputPayload  = $input['input_payload']  ?? [];
$outputPayload = $input['output_payload'] ?? [];
$meta          = is_array($input['meta'] ?? null) ? $input['meta'] : [];

if (!in_array($tool, CaseResults::ELIGIBLE_TOOLS, true)) {
    dbnToolsError('Unknown tool: ' . $tool, 400, 'bad_tool');
}
if (!is_array($inputPayload) || !is_array($outputPayload)) {
    dbnToolsError('input_payload and output_payload must be objects.', 400, 'bad_payload');
}

if ($title !== '') {
    $meta['title'] = $title;
}

// Normalise case_doc_ids from the input payload if not provided in meta.
if (empty($meta['case_doc_ids'])) {
    $ids = $inputPayload['doc_ids'] ?? [];
    $meta['case_doc_ids'] = is_array($ids) ? $ids : [];
}

$ownerId  = CaseStore::caseResolveClientId($userId);
$resultId = CaseResults::save($userId, $ownerId, $tool, $inputPayload, $outputPayload, $meta);

if ($resultId <= 0) {
    dbnToolsError('Could not save result. Check that your plan supports saved analyses.', 500, 'save_failed');
}

dbnToolsRespond(['ok' => true, 'result_id' => $resultId]);
