'use client'

import type {
  TrainingModule, TrainingBlockConfig, CanonicalControlMeta, BlockPreview, BlockGenerateResult,
} from '@/lib/sdk/training/types'
import { TARGET_AUDIENCE_LABELS, ROLE_LABELS, REGULATION_LABELS } from '@/lib/sdk/training/types'

interface BlocksSectionProps {
  blocks: TrainingBlockConfig[]
  canonicalMeta: CanonicalControlMeta | null
  blockPreview: BlockPreview | null
  blockPreviewId: string
  blockGenerating: boolean
  blockResult: BlockGenerateResult | null
  showBlockCreate: boolean
  onShowBlockCreate: (show: boolean) => void
  onPreviewBlock: (id: string) => void
  onGenerateBlock: (id: string) => void
  onDeleteBlock: (id: string) => void
  onCreateBlock: (data: {
    name: string; description?: string; domain_filter?: string; category_filter?: string;
    severity_filter?: string; target_audience_filter?: string; regulation_area: string;
    module_code_prefix: string; max_controls_per_module?: number;
  }) => void
}

export function BlocksSection({
  blocks, canonicalMeta, blockPreview, blockPreviewId, blockGenerating,
  blockResult, showBlockCreate, onShowBlockCreate, onPreviewBlock, onGenerateBlock,
  onDeleteBlock, onCreateBlock,
}: BlocksSectionProps) {
  return (
    <div className="bg-white border rounded-lg p-4">
      <div className="flex items-center justify-between mb-3">
        <div>
          <h3 className="text-sm font-medium text-gray-700">Schulungsbloecke aus Controls</h3>
          <p className="text-xs text-gray-500">
            Canonical Controls nach Kriterien filtern und automatisch Schulungsmodule generieren
            {canonicalMeta && <span className="ml-2 text-gray-400">({canonicalMeta.total} Controls verfuegbar)</span>}
          </p>
        </div>
        <button
          onClick={() => onShowBlockCreate(true)}
          className="px-3 py-1.5 text-xs bg-blue-600 text-white rounded-lg hover:bg-blue-700"
        >
          + Neuen Block erstellen
        </button>
      </div>

      {blocks.length > 0 ? (
        <div className="border rounded-lg overflow-hidden">
          <table className="w-full text-sm">
            <thead className="bg-gray-50">
              <tr>
                <th className="px-3 py-2 text-left font-medium text-gray-600">Name</th>
                <th className="px-3 py-2 text-left font-medium text-gray-600">Domain</th>
                <th className="px-3 py-2 text-left font-medium text-gray-600">Zielgruppe</th>
                <th className="px-3 py-2 text-left font-medium text-gray-600">Severity</th>
                <th className="px-3 py-2 text-left font-medium text-gray-600">Prefix</th>
                <th className="px-3 py-2 text-left font-medium text-gray-600">Letzte Generierung</th>
                <th className="px-3 py-2 text-right font-medium text-gray-600">Aktionen</th>
              </tr>
            </thead>
            <tbody className="divide-y">
              {blocks.map(block => (
                <tr key={block.id} className="hover:bg-gray-50">
                  <td className="px-3 py-2">
                    <div className="font-medium text-gray-900">{block.name}</div>
                    {block.description && <div className="text-xs text-gray-500">{block.description}</div>}
                  </td>
                  <td className="px-3 py-2 text-gray-600">{block.domain_filter || 'Alle'}</td>
                  <td className="px-3 py-2 text-gray-600">{block.target_audience_filter ? (TARGET_AUDIENCE_LABELS[block.target_audience_filter] || block.target_audience_filter) : 'Alle'}</td>
                  <td className="px-3 py-2 text-gray-600">{block.severity_filter || 'Alle'}</td>
                  <td className="px-3 py-2"><code className="text-xs bg-gray-100 px-1.5 py-0.5 rounded">{block.module_code_prefix}</code></td>
                  <td className="px-3 py-2 text-gray-500 text-xs">{block.last_generated_at ? new Date(block.last_generated_at).toLocaleString('de-DE') : 'Noch nie'}</td>
                  <td className="px-3 py-2 text-right">
                    <div className="flex gap-1 justify-end">
                      <button onClick={() => onPreviewBlock(block.id)} className="px-2 py-1 text-xs bg-gray-100 text-gray-700 rounded hover:bg-gray-200">Preview</button>
                      <button onClick={() => onGenerateBlock(block.id)} disabled={blockGenerating} className="px-2 py-1 text-xs bg-green-600 text-white rounded hover:bg-green-700 disabled:opacity-50">
                        {blockGenerating ? 'Generiert...' : 'Generieren'}
                      </button>
                      <button onClick={() => onDeleteBlock(block.id)} className="px-2 py-1 text-xs bg-red-100 text-red-700 rounded hover:bg-red-200">Loeschen</button>
                    </div>
                  </td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      ) : (
        <div className="text-center py-8 text-gray-500 text-sm">
          Noch keine Schulungsbloecke konfiguriert. Erstelle einen Block, um Controls automatisch in Module umzuwandeln.
        </div>
      )}

      {blockPreview && blockPreviewId && (
        <div className="mt-4 p-4 bg-blue-50 border border-blue-200 rounded-lg">
          <h4 className="text-sm font-medium text-blue-800 mb-2">Preview: {blocks.find(b => b.id === blockPreviewId)?.name}</h4>
          <div className="flex gap-6 text-sm mb-3">
            <span className="text-blue-700">Controls: <strong>{blockPreview.control_count}</strong></span>
            <span className="text-blue-700">Module: <strong>{blockPreview.module_count}</strong></span>
            <span className="text-blue-700">Rollen: <strong>{blockPreview.proposed_roles.map(r => ROLE_LABELS[r] || r).join(', ')}</strong></span>
          </div>
          {blockPreview.controls.length > 0 && (
            <details className="text-xs">
              <summary className="cursor-pointer text-blue-600 hover:text-blue-800">Passende Controls anzeigen ({blockPreview.control_count})</summary>
              <div className="mt-2 max-h-48 overflow-y-auto">
                {blockPreview.controls.slice(0, 50).map(ctrl => (
                  <div key={ctrl.control_id} className="flex gap-2 py-1 border-b border-blue-100">
                    <code className="text-xs bg-blue-100 px-1 rounded shrink-0">{ctrl.control_id}</code>
                    <span className="text-gray-700 truncate">{ctrl.title}</span>
                    <span className={`text-xs px-1.5 rounded shrink-0 ${ctrl.severity === 'critical' ? 'bg-red-100 text-red-700' : ctrl.severity === 'high' ? 'bg-orange-100 text-orange-700' : 'bg-gray-100 text-gray-600'}`}>{ctrl.severity}</span>
                  </div>
                ))}
                {blockPreview.control_count > 50 && <div className="text-gray-500 py-1">... und {blockPreview.control_count - 50} weitere</div>}
              </div>
            </details>
          )}
        </div>
      )}

      {blockResult && (
        <div className="mt-4 p-4 bg-green-50 border border-green-200 rounded-lg">
          <h4 className="text-sm font-medium text-green-800 mb-2">Generierung abgeschlossen</h4>
          <div className="flex gap-6 text-sm">
            <span className="text-green-700">Module erstellt: <strong>{blockResult.modules_created}</strong></span>
            <span className="text-green-700">Controls verknuepft: <strong>{blockResult.controls_linked}</strong></span>
            <span className="text-green-700">Matrix-Eintraege: <strong>{blockResult.matrix_entries_created}</strong></span>
            <span className="text-green-700">Content generiert: <strong>{blockResult.content_generated}</strong></span>
          </div>
          {blockResult.errors && blockResult.errors.length > 0 && (
            <div className="mt-2 text-xs text-red-600">
              {blockResult.errors.map((err, i) => <div key={i}>{err}</div>)}
            </div>
          )}
        </div>
      )}

      {showBlockCreate && (
        <BlockCreateModal
          canonicalMeta={canonicalMeta}
          onSubmit={onCreateBlock}
          onClose={() => onShowBlockCreate(false)}
        />
      )}
    </div>
  )
}

function BlockCreateModal({
  canonicalMeta,
  onSubmit,
  onClose,
}: {
  canonicalMeta: CanonicalControlMeta | null
  onSubmit: BlocksSectionProps['onCreateBlock']
  onClose: () => void
}) {
  return (
    <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40">
      <div className="bg-white rounded-xl shadow-xl w-full max-w-lg p-6">
        <h3 className="text-lg font-semibold mb-4">Neuen Schulungsblock erstellen</h3>
        <form onSubmit={e => {
          e.preventDefault()
          const fd = new FormData(e.currentTarget)
          onSubmit({
            name: fd.get('name') as string,
            description: fd.get('description') as string || undefined,
            domain_filter: fd.get('domain_filter') as string || undefined,
            category_filter: fd.get('category_filter') as string || undefined,
            severity_filter: fd.get('severity_filter') as string || undefined,
            target_audience_filter: fd.get('target_audience_filter') as string || undefined,
            regulation_area: fd.get('regulation_area') as string,
            module_code_prefix: fd.get('module_code_prefix') as string,
            max_controls_per_module: parseInt(fd.get('max_controls_per_module') as string) || 20,
          })
        }} className="space-y-3">
          <div>
            <label className="text-xs text-gray-600 block mb-1">Name *</label>
            <input name="name" required className="w-full px-3 py-2 text-sm border rounded-lg" placeholder="z.B. Authentifizierung fuer Geschaeftsfuehrung" />
          </div>
          <div>
            <label className="text-xs text-gray-600 block mb-1">Beschreibung</label>
            <textarea name="description" className="w-full px-3 py-2 text-sm border rounded-lg" rows={2} />
          </div>
          <div className="grid grid-cols-2 gap-3">
            <div>
              <label className="text-xs text-gray-600 block mb-1">Domain-Filter</label>
              <select name="domain_filter" className="w-full px-3 py-2 text-sm border rounded-lg bg-white">
                <option value="">Alle Domains</option>
                {canonicalMeta?.domains.map(d => <option key={d.domain} value={d.domain}>{d.domain} ({d.count})</option>)}
              </select>
            </div>
            <div>
              <label className="text-xs text-gray-600 block mb-1">Kategorie-Filter</label>
              <select name="category_filter" className="w-full px-3 py-2 text-sm border rounded-lg bg-white">
                <option value="">Alle Kategorien</option>
                {canonicalMeta?.categories.filter(c => c.category !== 'uncategorized').map(c => <option key={c.category} value={c.category}>{c.category} ({c.count})</option>)}
              </select>
            </div>
          </div>
          <div className="grid grid-cols-2 gap-3">
            <div>
              <label className="text-xs text-gray-600 block mb-1">Zielgruppe</label>
              <select name="target_audience_filter" className="w-full px-3 py-2 text-sm border rounded-lg bg-white">
                <option value="">Alle Zielgruppen</option>
                {canonicalMeta?.audiences.filter(a => a.audience !== 'unset').map(a => <option key={a.audience} value={a.audience}>{TARGET_AUDIENCE_LABELS[a.audience] || a.audience} ({a.count})</option>)}
              </select>
            </div>
            <div>
              <label className="text-xs text-gray-600 block mb-1">Severity</label>
              <select name="severity_filter" className="w-full px-3 py-2 text-sm border rounded-lg bg-white">
                <option value="">Alle</option>
                <option value="critical">Critical</option>
                <option value="high">High</option>
                <option value="medium">Medium</option>
                <option value="low">Low</option>
              </select>
            </div>
          </div>
          <div className="grid grid-cols-2 gap-3">
            <div>
              <label className="text-xs text-gray-600 block mb-1">Regulierungsbereich *</label>
              <select name="regulation_area" required className="w-full px-3 py-2 text-sm border rounded-lg bg-white">
                {Object.entries(REGULATION_LABELS).map(([k, v]) => <option key={k} value={k}>{v}</option>)}
              </select>
            </div>
            <div>
              <label className="text-xs text-gray-600 block mb-1">Modul-Code-Prefix *</label>
              <input name="module_code_prefix" required className="w-full px-3 py-2 text-sm border rounded-lg" placeholder="z.B. CB-AUTH" />
            </div>
          </div>
          <div>
            <label className="text-xs text-gray-600 block mb-1">Max. Controls pro Modul</label>
            <input name="max_controls_per_module" type="number" defaultValue={20} min={1} max={50} className="w-full px-3 py-2 text-sm border rounded-lg" />
          </div>
          <div className="flex gap-3 pt-2">
            <button type="submit" className="px-4 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700">Erstellen</button>
            <button type="button" onClick={onClose} className="px-4 py-2 text-sm bg-gray-100 text-gray-700 rounded-lg hover:bg-gray-200">Abbrechen</button>
          </div>
        </form>
      </div>
    </div>
  )
}
