<?php
/**
 * modules/admin/models.php — modelos por proveedor (pestañas JS: OpenRouter | Moonshot | MiniMax | Activos).
 * OpenRouter: catálogo automático (/models) con selección KamiChat/KamiCode (autosave en model_chat/model_code).
 * Moonshot/MiniMax: catálogo automático vía su API; selección guardada en settings propios (botón Guardar).
 */
if (!defined('IN_APP')) { die('Acceso denegado'); }

$admin  = new Admin($mysqli, $_config);
$hasKey = $admin->hasKey();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['brand_model'])) {        // auto-guardado del sobrenombre (persiste aparte)
        $admin->setBrand($_POST['brand_model'], $_POST['brand_value'] ?? '');
        if (!empty($_POST['ajax'])) { http_response_code(204); exit; }
        App::redirect('/admin/models/');
    }
    // Moonshot / MiniMax: selección aislada por proveedor (su propio botón Guardar).
    if (isset($_POST['save_moonshot'])) {
        $c = isset($_POST['model_chat_moonshot']) ? array_values(array_filter((array)$_POST['model_chat_moonshot'])) : array();
        $d = isset($_POST['model_code_moonshot']) ? array_values(array_filter((array)$_POST['model_code_moonshot'])) : array();
        $admin->setSetting('model_chat_moonshot', implode(',', $c));
        $admin->setSetting('model_code_moonshot', implode(',', $d));
        if (!empty($_POST['ajax'])) { http_response_code(204); exit; }
        App::redirect('/admin/models/#moonshot');
    }
    if (isset($_POST['save_minimax'])) {
        $c = isset($_POST['model_chat_minimax']) ? array_values(array_filter((array)$_POST['model_chat_minimax'])) : array();
        $d = isset($_POST['model_code_minimax']) ? array_values(array_filter((array)$_POST['model_code_minimax'])) : array();
        $admin->setSetting('model_chat_minimax', implode(',', $c));
        $admin->setSetting('model_code_minimax', implode(',', $d));
        if (!empty($_POST['ajax'])) { http_response_code(204); exit; }
        App::redirect('/admin/models/#minimax');
    }
    // OpenRouter (autosave / fallback sin JS).
    $chat = isset($_POST['model_chat']) ? array_values(array_filter((array)$_POST['model_chat'])) : array();
    $code = isset($_POST['model_code']) ? array_values(array_filter((array)$_POST['model_code'])) : array();
    $admin->setSetting('model_chat', implode(',', $chat));
    $admin->setSetting('model_code', implode(',', $code));
    if (!empty($_POST['ajax'])) { http_response_code(204); exit; } // auto-guardado
    App::redirect('/admin/models/');
}

$models   = $hasKey ? $admin->models() : array();
$brands   = $admin->brands();
$sel_chat = array_filter(explode(',', (string)$admin->getSetting('model_chat', '')));
$sel_code = array_filter(explode(',', (string)$admin->getSetting('model_code', '')));

// Catálogos y selección de otros proveedores.
$moon         = $admin->moonshotModels();
$mini         = $admin->minimaxModels();
$selChatMoon  = array_filter(explode(',', (string)$admin->getSetting('model_chat_moonshot', '')));
$selCodeMoon  = array_filter(explode(',', (string)$admin->getSetting('model_code_moonshot', '')));
$selChatMini  = array_filter(explode(',', (string)$admin->getSetting('model_chat_minimax', '')));
$selCodeMini  = array_filter(explode(',', (string)$admin->getSetting('model_code_minimax', '')));

// Modelos activos = seleccionados en KamiChat o KamiCode, de cualquier proveedor.
// Cada uno lleva su 'source' (OpenRouter/Moonshot/MiniMax) y en qué producto está.
$active = array();
$collectActive = function ($list, $selChat, $selCode, $source) use (&$active) {
    foreach ($list as $m) {
        $inChat = in_array($m['id'], $selChat, true);
        $inCode = in_array($m['id'], $selCode, true);
        if ($inChat || $inCode) {
            $m['source']  = $source;
            $m['in_chat'] = $inChat;
            $m['in_code'] = $inCode;
            $active[] = $m;
        }
    }
};
$collectActive($models, $sel_chat, $sel_code, 'OpenRouter');
$collectActive($moon, $selChatMoon, $selCodeMoon, 'Moonshot');
$collectActive($mini, $selChatMini, $selCodeMini, 'MiniMax');

$page_title = App::t('admin.models_title');

$cost = function ($v) {
    if ($v === null) return '—';
    if ($v < 0) return 'var';
    if ($v == 0.0) return App::t('admin.free');
    return '$' . rtrim(rtrim(number_format($v, 2), '0'), '.');
};

// Capacidades: clave canónica => etiqueta (para badges y filtro).
$capLabels = array(
    'vision'    => App::t('admin.cap_vision'),
    'file'      => App::t('admin.cap_file'),
    'video'     => App::t('admin.cap_video'),
    'audio'     => App::t('admin.cap_audio'),
    'imageout'  => App::t('admin.cap_imageout'),
    'tools'     => 'tools',
    'reasoning' => App::t('admin.cap_reasoning'),
    'json'      => App::t('admin.cap_json'),
);
?>
<div class="px-4 py-6">
<?php include __DIR__ . '/_tabs.php'; ?>

<!-- ===== Panel: OpenRouter ===== -->
<div data-tab-panel="openrouter" data-tab-group="models">
<?php if (!$hasKey): ?>
  <div class="rounded-lg border border-accent/40 bg-accent-soft px-4 py-3 text-sm text-ink-900">
    <?= App::e(App::t('admin.need_key')) ?> <a href="/admin/config/" class="font-medium underline"><?= App::e(App::t('admin.config_title')) ?></a>
  </div>
<?php elseif (!$models): ?>
  <div class="rounded-lg border border-danger/30 bg-danger/10 px-4 py-3 text-sm text-danger"><?= App::e(App::t('admin.models_error')) ?></div>
<?php else: ?>
<form method="post" action="/admin/models/">
  <div class="overflow-hidden rounded-lg border border-gray-200 bg-white dark:border-ink-700 dark:bg-ink-900">

    <!-- Cabecera: contadores + guardar -->
    <div class="flex flex-wrap items-center gap-x-4 gap-y-1 border-b border-gray-200 px-4 py-3 text-sm dark:border-ink-700">
      <span class="font-medium"><?= count($models) ?> <?= App::e(App::t('admin.models_word')) ?></span>
      <span class="text-gray-dark dark:text-gray-light">·</span>
      <span class="text-gray-dark dark:text-gray-light"><span data-count="chat"><?= count($sel_chat) ?></span> <?= App::e(App::t('admin.in_chat')) ?></span>
      <span class="text-gray-dark dark:text-gray-light"><span data-count="code"><?= count($sel_code) ?></span> <?= App::e(App::t('admin.in_code')) ?></span>
      <span class="ml-auto text-xs text-gray-light"><?= App::e(App::t('admin.autosave')) ?></span>
      <span data-save-status data-saved-text="<?= App::e(App::t('admin.saved')) ?>" class="text-xs font-medium text-success"></span>
    </div>

    <div class="overflow-x-auto">
      <table class="w-full text-sm">
        <thead>
          <tr class="border-b border-gray-200 bg-gray-50 text-left text-xs uppercase tracking-wide text-gray-dark dark:border-ink-700 dark:bg-ink-800 dark:text-gray-light">
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.th_model')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.th_company')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.th_capabilities')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.th_context')) ?></th>
            <th class="px-4 py-2 text-right font-semibold">
              <button type="button" data-sort="cost" class="inline-flex items-center gap-1 uppercase">
                <?= App::e(App::t('admin.th_cost')) ?> <span class="normal-case text-gray-light">($/1M)</span>
                <span data-sort-arrow>↕</span>
              </button>
            </th>
            <th class="px-4 py-2 text-center font-semibold">
              <button type="button" data-show="chat" title="<?= App::e(App::t('admin.show_selected')) ?>" class="uppercase">KamiChat</button>
            </th>
            <th class="px-4 py-2 text-center font-semibold">
              <button type="button" data-show="code" title="<?= App::e(App::t('admin.show_selected')) ?>" class="uppercase">KamiCode</button>
            </th>
          </tr>
          <!-- Filtros por columna -->
          <tr class="border-b border-gray-200 bg-gray-50 dark:border-ink-700 dark:bg-ink-800">
            <th class="px-3 py-2"><input type="search" data-col-filter="model" data-filter-target="models" placeholder="<?= App::e(App::t('admin.filter')) ?>" class="w-full rounded-md border border-gray-200 bg-white px-2 py-1 text-xs font-normal outline-none focus:border-primary-600 dark:border-ink-700 dark:bg-ink-900"></th>
            <th class="px-3 py-2"><input type="search" data-col-filter="company" data-filter-target="models" placeholder="<?= App::e(App::t('admin.filter')) ?>" class="w-full rounded-md border border-gray-200 bg-white px-2 py-1 text-xs font-normal outline-none focus:border-primary-600 dark:border-ink-700 dark:bg-ink-900"></th>
            <th class="px-3 py-2">
              <select data-col-filter="caps" data-filter-target="models" class="w-full rounded-md border border-gray-200 bg-white px-2 py-1 text-xs font-normal outline-none focus:border-primary-600 dark:border-ink-700 dark:bg-ink-900">
                <option value=""><?= App::e(App::t('admin.cap_all')) ?></option>
                <?php foreach ($capLabels as $ck => $cl): ?>
                  <option value="<?= App::e($ck) ?>"><?= App::e($cl) ?></option>
                <?php endforeach; ?>
              </select>
            </th>
            <th class="px-3 py-2"></th>
            <th colspan="3"></th>
          </tr>
        </thead>
        <tbody class="divide-y divide-gray-200 dark:divide-ink-700" data-filter-list="models">
          <?php foreach ($models as $m):
            $ctx  = $m['context'] >= 1000 ? round($m['context'] / 1000) . 'K' : ($m['context'] ?: '—');
            $caps = $m['caps'];
            $sc = ($m['price_in'] !== null && $m['price_in'] >= 0) ? $m['price_in'] : 1000000000; // var/desconocido al final
            ?>
            <tr data-filter-row
                data-col-model="<?= App::e(strtolower($m['name'] . ' ' . $m['id'])) ?>"
                data-col-company="<?= App::e(strtolower($m['company'])) ?>"
                data-col-caps="<?= App::e(implode(' ', $caps)) ?>"
                data-cost="<?= App::e($sc) ?>"
                class="hover:bg-gray-50 dark:hover:bg-ink-800/50">
              <td class="px-4 py-2">
                <div class="font-medium"><?= App::e($m['name']) ?></div>
                <div class="font-mono text-xs text-gray-dark dark:text-gray-light"><?= App::e($m['id']) ?></div>
              </td>
              <td class="px-4 py-2 text-gray-dark dark:text-gray-light"><?= App::e($m['company']) ?></td>
              <td class="px-4 py-2">
                <div class="flex max-w-[14rem] flex-wrap items-center gap-1">
                  <?php foreach ($caps as $c): ?>
                    <span class="rounded bg-primary-50 px-1.5 py-0.5 text-xs text-primary-700 dark:bg-primary-900/30 dark:text-primary-300"><?= App::e($capLabels[$c] ?? $c) ?></span>
                  <?php endforeach; ?>
                  <?php if (!$caps): ?><span class="text-xs text-gray-light">—</span><?php endif; ?>
                </div>
              </td>
              <td class="whitespace-nowrap px-4 py-2"><?= App::e($ctx) ?></td>
              <td class="whitespace-nowrap px-4 py-2 text-right text-xs">
                <div><span class="text-gray-light">in</span> <?= App::e($cost($m['price_in'])) ?></div>
                <div><span class="text-gray-light">out</span> <?= App::e($cost($m['price_out'])) ?></div>
              </td>
              <td class="px-4 py-2 text-center">
                <input type="checkbox" name="model_chat[]" value="<?= App::e($m['id']) ?>" data-role="chat" <?= in_array($m['id'], $sel_chat, true) ? 'checked' : '' ?> class="h-4 w-4 accent-primary-600">
              </td>
              <td class="px-4 py-2 text-center">
                <input type="checkbox" name="model_code[]" value="<?= App::e($m['id']) ?>" data-role="code" <?= in_array($m['id'], $sel_code, true) ? 'checked' : '' ?> class="h-4 w-4 accent-primary-600">
              </td>
            </tr>
          <?php endforeach; ?>
        </tbody>
      </table>
    </div>
  </div>
</form>
<?php endif; ?>
</div><!-- /panel openrouter -->

<!-- ===== Panel: Moonshot ===== -->
<div data-tab-panel="moonshot" data-tab-group="models" class="hidden">
<?php
  $pv_models   = $moon;
  $pv_hasKey   = $admin->hasKimiKey();
  $pv_selChat  = $selChatMoon;
  $pv_selCode  = $selCodeMoon;
  $pv_chatName = 'model_chat_moonshot';
  $pv_codeName = 'model_code_moonshot';
  $pv_saveField = 'save_moonshot';
  $pv_pricing  = $admin->providerPricing('moonshot');
  include __DIR__ . '/_provider_models.php';
?>
</div><!-- /panel moonshot -->

<!-- ===== Panel: MiniMax ===== -->
<div data-tab-panel="minimax" data-tab-group="models" class="hidden">
<?php
  $pv_models   = $mini;
  $pv_hasKey   = $admin->hasMinimaxKey();
  $pv_selChat  = $selChatMini;
  $pv_selCode  = $selCodeMini;
  $pv_chatName = 'model_chat_minimax';
  $pv_codeName = 'model_code_minimax';
  $pv_saveField = 'save_minimax';
  $pv_pricing  = $admin->providerPricing('minimax');
  include __DIR__ . '/_provider_models.php';
?>
</div><!-- /panel minimax -->

<!-- ===== Panel: Modelos activos (rebranding OpenRouter) ===== -->
<div data-tab-panel="active" data-tab-group="models" class="hidden">
  <div class="overflow-hidden rounded-lg border border-gray-200 bg-white dark:border-ink-700 dark:bg-ink-900">
    <div class="flex flex-wrap items-center gap-x-4 gap-y-1 border-b border-gray-200 px-4 py-3 text-sm dark:border-ink-700">
      <span class="font-medium"><?= count($active) ?> <?= App::e(App::t('admin.models_word')) ?></span>
      <span class="ml-auto text-xs text-gray-light"><?= App::e(App::t('admin.brand_hint')) ?></span>
    </div>
    <?php if (!$active): ?>
      <div class="px-4 py-6 text-sm text-gray-dark dark:text-gray-light"><?= App::e(App::t('admin.no_active')) ?></div>
    <?php else: ?>
    <div class="overflow-x-auto">
      <table class="w-full text-sm">
        <thead>
          <tr class="border-b border-gray-200 bg-gray-50 text-left text-xs uppercase tracking-wide text-gray-dark dark:border-ink-700 dark:bg-ink-800 dark:text-gray-light">
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.th_model')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.th_source')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.th_brand')) ?></th>
            <th class="px-4 py-2 font-semibold"><?= App::e(App::t('admin.th_company')) ?></th>
            <th class="px-4 py-2 text-center font-semibold"><?= App::e(App::t('admin.th_products')) ?></th>
          </tr>
        </thead>
        <tbody class="divide-y divide-gray-200 dark:divide-ink-700">
          <?php foreach ($active as $m): ?>
            <tr class="hover:bg-gray-50 dark:hover:bg-ink-800/50">
              <td class="px-4 py-2">
                <div class="font-medium"><?= App::e($m['name']) ?></div>
                <div class="font-mono text-xs text-gray-dark dark:text-gray-light"><?= App::e($m['id']) ?></div>
              </td>
              <td class="px-4 py-2">
                <span class="rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium text-ink-900 dark:bg-ink-800 dark:text-paper"><?= App::e($m['source']) ?></span>
              </td>
              <td class="px-4 py-2">
                <input type="text" data-brand-model="<?= App::e($m['id']) ?>" value="<?= App::e($brands[$m['id']] ?? '') ?>" placeholder="<?= App::e(App::t('admin.brand_ph')) ?>"
                       class="w-48 rounded-md border border-gray-200 bg-white px-2 py-1 text-xs outline-none focus:border-primary-600 dark:border-ink-700 dark:bg-ink-800">
              </td>
              <td class="px-4 py-2 text-gray-dark dark:text-gray-light"><?= App::e($m['company']) ?></td>
              <td class="px-4 py-2 text-center">
                <div class="flex flex-wrap items-center justify-center gap-1">
                  <?php if (!empty($m['in_chat'])): ?>
                    <span class="rounded bg-primary-50 px-1.5 py-0.5 text-xs text-primary-700 dark:bg-primary-900/30 dark:text-primary-300">KamiChat</span>
                  <?php endif; ?>
                  <?php if (!empty($m['in_code'])): ?>
                    <span class="rounded bg-primary-50 px-1.5 py-0.5 text-xs text-primary-700 dark:bg-primary-900/30 dark:text-primary-300">KamiCode</span>
                  <?php endif; ?>
                </div>
              </td>
            </tr>
          <?php endforeach; ?>
        </tbody>
      </table>
    </div>
    <?php endif; ?>
  </div>
</div><!-- /panel active -->

</div>
