import { ChatReasoning, LogStream } from '@astryxdesign/lab'
import { Markdown } from '@astryxdesign/core/Markdown'
import { Collapsible } from '@astryxdesign/core/Collapsible'
import { SectionCard, formatDurationMs } from '@overdeck/deck-ui'
import { useState } from 'react'
import { adapterIdForPanel } from '../../lib/collector-client'
import { useCollectorState } from '../../lib/collector-queries'
import type { FactoryPanelData, FactoryRunView } from '../../lib/factory-types'
import { CollectorQueryBoundary } from '../shared/CollectorQueryBoundary'
import { FactoryRawTrace } from './FactoryRawTrace'
import { FactoryStepDrawer } from './FactoryStepDrawer'
import { factoryAgentHref, failureReasons, transcriptSteps, type TranscriptStep } from './factory-run-view-helpers'
import { isFactoryRunning } from './factory-helpers'

function Transcript({run}:{run:FactoryRunView}) { const [selected,setSelected]=useState<TranscriptStep|null>(null); const steps=transcriptSteps(run); const failures=failureReasons(run); const wall=run.startedAt&&run.endedAt&&Number.isFinite(Date.parse(run.startedAt))&&Number.isFinite(Date.parse(run.endedAt)) ? formatDurationMs(Date.parse(run.endedAt)-Date.parse(run.startedAt)) : null; return <div className="grid min-w-0 gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(16rem,24rem)]"><SectionCard title={run.adwName ?? run.adwId} className="min-w-0"><div className="space-y-4" data-testid="factory-transcript">{run.request&&<section><h2 className="font-semibold">Request</h2><Collapsible trigger="Show request"><Markdown>{run.request}</Markdown></Collapsible></section>}{steps.length===0?<p>No steps recorded for {run.adwId}</p>:steps.map(step=>{const activityHref=factoryAgentHref(run,step);return <div key={`${step.type}-${step.id}`} className={step.type==='attempt'?'ml-6':''}><ChatReasoning label={step.summary || step.id} duration={step.type==='phase'&&step.phase.durationMs!=null?formatDurationMs(step.phase.durationMs):step.type==='attempt'&&step.attempt.durationMs!=null?formatDurationMs(step.attempt.durationMs):undefined} isStreaming={step.isStreaming}>{step.type==='phase'?step.phase.description??step.phase.error??step.phase.name??step.id:step.attempt.error??step.attempt.agent??step.id}</ChatReasoning><div className="flex flex-wrap gap-3"><button type="button" onClick={()=>setSelected(step)} className="min-h-11 text-xs text-accent focus-visible:outline-2 focus-visible:outline-accent">Open details</button>{activityHref?<a href={activityHref} className="inline-flex min-h-11 items-center text-xs font-semibold text-accent underline focus-visible:outline-2 focus-visible:outline-accent">Open activity</a>:null}</div></div>})}<section className="border-t border-border pt-3"><h2 className="font-semibold">{run.status ?? 'unknown'}</h2><p className="tabular-nums">{run.totalTokens!=null&&`Tokens: ${run.totalTokens}`} {run.totalCost!=null&&` Cost: ${run.totalCost}`} {wall&&` Wall time: ${wall}`}</p>{failures.map((reason,index)=><p key={index} className="text-danger">{reason}</p>)}</section><Collapsible trigger="Raw trace"><FactoryRawTrace run={run}/></Collapsible></div>{selected&&<FactoryStepDrawer step={selected} gates={(run.gates ?? []).filter(g=>g.phaseId===selected.phase.phaseId)} runAttempts={run.attempts ?? []} onClose={()=>setSelected(null)}/>}</SectionCard>{isFactoryRunning(run.status)&&<aside className="min-w-0 border border-border bg-surface p-3"><h2 className="font-semibold">Activity</h2>{steps.filter((step): step is Extract<TranscriptStep,{type:'attempt'}>=>step.type==='attempt'&&step.isStreaming).flatMap(step=>step.attempt.toolCalls ?? []).sort((a,b)=>a.seq-b.seq).slice(-100).map(tool=><LogStream key={tool.toolCallId} variant="terminal" hasTimestamps={false} label={tool.toolName ?? 'tool'} entries={[{id:tool.toolCallId,timestamp:tool.startedAt ?? '',level:tool.ok===false?'error':'info',message:tool.resultExcerpt ?? ''}]}/>)}</aside>}</div> }
export function FactoryRunContent({adwId}:{adwId:string}) { const query=useCollectorState(); return <CollectorQueryBoundary query={query}>{state=>{const panel=state.panels.find(p=>p.id==='factory-runs'); const data=panel?.data as FactoryPanelData|undefined; const adapter=state.adapters.find(a=>a.id===adapterIdForPanel('factory-runs')); if(!panel)return <p className="text-sm text-fg-muted">Factory panel is not present in collector state. Check that the factory adapter is enabled.</p>; if(adapter?.lastError||(adapter?.consecutiveErrors??0)>0)return <p className="text-sm text-danger">Factory collector is failing{adapter?.lastError?`: ${adapter.lastError}`:'.'}</p>; if(!data?.dbPresent)return <p className="text-sm text-fg-muted">Factory trace database is not available{data?.dbPath?` at ${data.dbPath}`:''}.</p>; const run=data.runs.find(r=>r.adwId===adwId); return run?<Transcript run={run}/>:<p className="text-sm text-fg-muted">Factory run {adwId} was not found.</p>}}</CollectorQueryBoundary> }
