import { describe, it, expect } from 'vitest'
import { render, screen, fireEvent } from '@testing-library/react'

import { AgentResultTab } from '../AgentResultTab'
import { ComplianceResultTabs } from '../ComplianceResultTabs'
import type { SlotOutput } from '../_agentTypes'

const IMPRESSUM_OUTPUT: SlotOutput = {
  agent: 'impressum',
  agent_version: '3.0',
  duration_ms: 42,
  confidence: 0.9,
  notes: '12 §5-TMG-MCs geprüft · 2 Pflichtangabe(n) offen',
  findings: [
    {
      check_id: 'IMP-kontakt_email', agent: 'impressum', agent_version: '3.0',
      field_id: 'kontakt_email', severity: 'HIGH',
      severity_reason: 'pflichtangabe_missing',
      title: 'Pflichtangabe fehlt: Email-Adresse',
      norm: '§ 5 Abs. 1 Nr. 2 TMG', evidence: '',
      action: 'Pflichtangabe ergänzen: Email-Adresse.', confidence: 0.9,
      sources: [{ source_type: 'regex', source_id: 'IMP-MC-002', confidence: 0.9 }],
    },
    {
      check_id: 'IMP-kontakt_telefon', agent: 'impressum', agent_version: '3.0',
      field_id: 'kontakt_telefon', severity: 'MEDIUM',
      severity_reason: 'pflichtangabe_missing',
      title: 'Pflichtangabe fehlt: Telefon',
      norm: '§ 5 Abs. 1 Nr. 2 TMG', evidence: '',
      action: 'Pflichtangabe ergänzen: Telefon.', confidence: 0.9,
      sources: [{ source_type: 'regex', source_id: 'IMP-MC-003', confidence: 0.9 }],
    },
  ],
  recommendations: [
    {
      recommendation_id: 'rec1', title: 'Pflichtangaben ergänzen',
      body: 'Email und Telefon im Impressum ergänzen.', severity: 'HIGH',
      related_finding_ids: ['IMP-kontakt_email', 'IMP-kontakt_telefon'],
      estimated_effort_hours: 0.5,
    },
  ],
  mc_coverage: [
    { mc_id: 'IMP-MC-002', status: 'high', reason: 'kein Pattern-Treffer' },
    { mc_id: 'IMP-MC-003', status: 'medium', reason: 'kein Pattern-Treffer' },
    { mc_id: 'IMP-MC-001', status: 'ok', reason: 'Pattern-Treffer' },
  ],
  escalation_log: [],
  mc_total: 3, mc_ok: 1, mc_na: 0, mc_high: 1, mc_medium: 1, mc_low: 0,
}

describe('AgentResultTab', () => {
  it('rendert Findings nach Severity + Maßnahmen + Coverage', () => {
    render(<AgentResultTab topicLabel="Impressum" output={IMPRESSUM_OUTPUT} />)
    // Themen-Header + Severity-Ampel
    expect(screen.getByRole('heading', { name: 'Impressum' })).toBeInTheDocument()
    expect(screen.getByText('1 HIGH')).toBeInTheDocument()
    expect(screen.getByText('1 MEDIUM')).toBeInTheDocument()
    // Findings-Sektion mit Titeln
    expect(screen.getByText(/Findings \(2\)/)).toBeInTheDocument()
    expect(screen.getByText('Pflichtangabe fehlt: Email-Adresse')).toBeInTheDocument()
    expect(screen.getByText('Pflichtangabe fehlt: Telefon')).toBeInTheDocument()
    // Abstellmaßnahme (action) am HIGH-Finding
    expect(screen.getByText('Pflicht-Maßnahme')).toBeInTheDocument()
    expect(screen.getByText('Pflichtangabe ergänzen: Email-Adresse.')).toBeInTheDocument()
    // Konsolidierter Maßnahmen-Plan
    expect(screen.getByText(/Maßnahmen-Plan \(1 konsolidiert\)/)).toBeInTheDocument()
    expect(screen.getByText('Pflichtangaben ergänzen')).toBeInTheDocument()
  })
})

const DOC_RESULT = {
  label: 'Impressum', url: 'https://example.com/impressum',
  doc_type: 'impressum', word_count: 50, completeness_pct: 100,
  correctness_pct: 100, findings_count: 0, error: '', scenario: 'import',
  checks: [
    { id: 'name', label: 'Name des Anbieters', passed: true, severity: 'HIGH',
      matched_text: 'Bayerische Motoren Werke Aktiengesellschaft', level: 1 },
    { id: 'email', label: 'E-Mail-Adresse', passed: true, severity: 'HIGH',
      matched_text: 'kundenbetreuung@bmw.de', level: 1 },
  ],
}

describe('ComplianceResultTabs', () => {
  it('rendert das Dokument-Tab der Haupt-Engine mit extrahierten Texten', () => {
    // Themen-Tabs kommen aus result.results (Haupt-Engine), NICHT agent_outputs.
    const result = { results: [DOC_RESULT] }
    render(<ComplianceResultTabs results={result} />)
    // Dokument-Tab + Übersicht
    expect(screen.getByRole('button', { name: /Impressum/ })).toBeInTheDocument()
    expect(screen.getByRole('button', { name: /Alle Checks/ })).toBeInTheDocument()
    // DocResultView: menschliches Label + gefundener Text sichtbar
    expect(screen.getByText('Name des Anbieters')).toBeInTheDocument()
    expect(screen.getByText(/Bayerische Motoren Werke/)).toBeInTheDocument()
    // Wechsel auf die Übersicht
    fireEvent.click(screen.getByRole('button', { name: /Alle Checks/ }))
    expect(
      screen.getByText(/Dokumenten-Pruefung/),
    ).toBeInTheDocument()
  })
})
