oxios 1.13.1

Oxios Agent OS — Agent Operating System powered by oxi-sdk
import { Activity, Cpu, Timer } from 'lucide-react'
import { useTranslation } from 'react-i18next'
import { Badge } from '@/components/ui/badge'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { useTokenMaxingStatus } from '@/hooks/use-token-maxing'

/** Status header — running flag, current provider + task, this-session totals,
 *  active window (or "수동(Manual)"). Mirrors the `Card` + `Badge` pattern
 *  used by CostSummaryCards / ProviderQuotaCards.
 */
export function TokenMaxingStatusHeader() {
  const { t } = useTranslation()
  const { data, isLoading } = useTokenMaxingStatus()

  return (
    <Card>
      <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
        <CardTitle className="flex items-center gap-2 text-base">
          <Activity className="h-4 w-4" />
          {t('tokenMaxing.status.title')}
        </CardTitle>
        <SessionStateBadge running={data?.running ?? false} />
      </CardHeader>
      <CardContent>
        {isLoading ? (
          <p className="text-sm text-muted-foreground py-2">{t('common.loading')}</p>
        ) : (
          <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
            <Field
              label={t('tokenMaxing.status.currentProvider')}
              value={data?.current_provider ?? t('tokenMaxing.status.noneActive')}
              icon={<Cpu className="h-4 w-4 text-muted-foreground" />}
            />
            <Field
              label={t('tokenMaxing.status.currentTask')}
              value={data?.current_task ?? t('tokenMaxing.status.noActiveTask')}
            />
            <Field
              label={t('tokenMaxing.status.tokensThisSession')}
              value={(data?.tokens_this_session ?? 0).toLocaleString()}
            />
            <Field
              label={t('tokenMaxing.status.tasksThisSession')}
              value={(data?.tasks_this_session ?? 0).toLocaleString()}
            />
            <WindowField window={data?.window ?? null} manual={data?.manual ?? false} />
          </div>
        )}
      </CardContent>
    </Card>
  )
}

function SessionStateBadge({ running }: { running: boolean }) {
  const { t } = useTranslation()
  return (
    <Badge variant={running ? 'success' : 'secondary'}>
      {running ? t('tokenMaxing.status.running') : t('tokenMaxing.status.idle')}
    </Badge>
  )
}

function Field({ label, value, icon }: { label: string; value: string; icon?: React.ReactNode }) {
  return (
    <div className="space-y-1">
      <div className="flex items-center gap-2 text-xs text-muted-foreground">
        {icon}
        <span>{label}</span>
      </div>
      <p className="text-sm font-medium">{value}</p>
    </div>
  )
}

function WindowField({
  window,
  manual,
}: {
  window: { start: string; end: string } | null
  manual: boolean
}) {
  const { t } = useTranslation()
  let value: string
  if (manual) {
    value = t('tokenMaxing.status.manual')
  } else if (window) {
    value = `${formatDateTime(window.start)} → ${formatDateTime(window.end)}`
  } else {
    value = t('tokenMaxing.status.noWindow')
  }
  return (
    <div className="space-y-1 sm:col-span-2 lg:col-span-4">
      <div className="flex items-center gap-2 text-xs text-muted-foreground">
        <Timer className="h-4 w-4" />
        <span>{t('tokenMaxing.status.window')}</span>
      </div>
      <p className="text-sm font-medium">{value}</p>
    </div>
  )
}

function formatDateTime(iso: string): string {
  const d = new Date(iso)
  if (Number.isNaN(d.getTime())) return iso
  return d.toLocaleString()
}