import { chromium, firefox, webkit, type BrowserType } from "playwright";

export type EngineName = "chromium" | "firefox" | "webkit";

export {
  renderedDetectors,
  renderedDetectorByRuleId,
  runRenderedCell,
  runRenderedMatrix,
  captureRenderedProbe,
  buildUi001Evidence,
} from "./rendered/index.js";

export {
  geometryDetectors,
  geometryDetectorByRuleId,
  runGeometryCell,
  runGeometryMatrix,
  captureGeometryProbe,
  captureGeometryArtifacts,
  buildUi025Evidence,
} from "./geometry/index.js";

export {
  annotateScreenshot,
  annotatedArtifactRelativePath,
  ANNOTATED_ARTIFACT_KIND,
  ANNOTATED_MEDIA_TYPE,
} from "./annotation/annotate.js";

export {
  layoutDetectors,
  layoutDetectorByRuleId,
  runLayoutCell,
  runLayoutMatrix,
  captureLayoutProbe,
  captureLayoutArtifacts,
  buildUi001Evidence as buildLayoutUi001Evidence,
  CLS_GOOD_THRESHOLD,
} from "./layout/index.js";

export {
  interactionDetectors,
  interactionDetectorByRuleId,
  classifyInteractionEvidence,
  captureDeclaredJourneyEvidence,
  runInteractionCell,
  runDeclaredJourney,
  attachInteractionCaptureListeners,
  DeclaredJourneyRunError,
  runInteractionMatrix,
  captureInteractionProbe,
  captureInteractionArtifacts,
  buildUi001Evidence as buildInteractionUi001Evidence,
} from "./interaction/index.js";

export {
  consistencyDetectors,
  consistencyDetectorByRuleId,
  runConsistencyCell,
  runConsistencyMatrix,
  captureConsistencyProbe,
  captureConsistencyArtifacts,
  buildUi001Evidence as buildConsistencyUi001Evidence,
  buildConsistencyMatrixEvidence,
} from "./consistency/index.js";

export {
  relationsDetectors,
  relationsDetectorByRuleId,
  runRelationsCell,
  runRelationsMatrix,
  captureRelationsProbe,
  captureRelationsArtifacts,
  buildUi001Evidence as buildRelationsUi001Evidence,
  detectCrossRepresentationViolations,
  buildRelationGraphForWidget,
} from "./relations/index.js";

export {
  sweepsDetectors,
  sweepsDetectorByRuleId,
  runSweepsCell,
  runSweepsMatrix,
  captureSweepsProbe,
  captureSweepsArtifacts,
  buildUi001Evidence as buildSweepsUi001Evidence,
  detectLocaleSweepViolations,
  detectResponsiveSweepViolations,
  detectDimensionReachabilityGaps,
  buildSweepsMatrixEvidence,
} from "./sweeps/index.js";

export {
  a11yDetectors,
  a11yDetectorByRuleId,
  runA11yCell,
  runA11yMatrix,
  captureA11yProbe,
  captureA11yArtifacts,
  buildUi001Evidence as buildA11yUi001Evidence,
  detectAxeViolations,
  detectDirectA11yViolations,
  detectActionSequenceViolations,
  buildDetectorCapabilityRecord,
  buildA11yMatrixEvidence,
  detectCapabilityGaps,
  forcedColorsConflictResolved,
  runAxeOnPage,
} from "./a11y/index.js";

export {
  assetsDetectors,
  assetsDetectorByRuleId,
  runAssetsCell,
  runAssetsMatrix,
  captureAssetsProbe,
  captureAssetsArtifacts,
  buildUi001Evidence as buildAssetsUi001Evidence,
  detectMissingBlockedImages,
  detectLargeEmptyContainers,
  detectUnexplainedDisabledStyling,
  requiredContentContractProofMet,
  disabledStylingContractProofMet,
  LARGE_EMPTY_MIN_AREA,
  LARGE_EMPTY_MIN_DIMENSION,
  DISABLED_OPACITY_THRESHOLD,
} from "./assets/index.js";

export {
  applyVisionAdapter,
  readVisionAnnotationsFromEvidence,
  validateVisionAnnotation,
  VISION_DETECTOR_CLASS,
  VISION_DETECTOR_ID,
  VISION_DETECTOR_VERSION,
} from "./vision/adapter.js";

export {
  blockingCalibrationCatalog,
  buildEngineCapabilityProfile,
  calibrationCoverageOutcomes,
  calibrationRoutes,
  collectUnavailableEngineGaps,
  engineProfileFeature,
  findingsForDetector,
  launchEngine,
  makeCalibrationStores,
  runCalibrationCase,
  CALIBRATION_DIRECTIONS,
  CALIBRATION_ENGINES,
  type CalibrationEntry,
  type CalibrationRunResult,
  type TextDirection,
} from "./calibration/index.js";

export type {
  RenderedCellEvidence,
  RenderedFixture,
  RenderedFixtureVariant,
  RenderedProbe,
  RenderedRuleId,
  Ui001EvidenceRecord as RenderedUi001EvidenceRecord,
} from "./rendered/index.js";

export type {
  GeometryCellEvidence,
  GeometryFixture,
  GeometryFixtureVariant,
  GeometryProbe,
  GeometryRuleId,
  Ui001EvidenceRecord,
  Ui025GeometryEvidence,
} from "./geometry/index.js";

export type {
  AnnotateScreenshotInput,
  AnnotationMarker,
} from "./annotation/annotate.js";

export type {
  LayoutCellEvidence,
  LayoutFixture,
  LayoutFixtureVariant,
  LayoutProbe,
  LayoutRuleId,
  TransitionCheckpointKind,
  Ui001EvidenceRecord as LayoutUi001EvidenceRecord,
} from "./layout/index.js";

export type {
  InteractionCellEvidence,
  InteractionFixture,
  InteractionFixtureVariant,
  InteractionProbe,
  InteractionRuleId,
  InteractionScenario,
  InteractionPromiseCheck,
  Ui001EvidenceRecord as InteractionUi001EvidenceRecord,
} from "./interaction/index.js";

export type {
  ConsistencyCellEvidence,
  ConsistencyMatrixEvidence,
  ConsistencyFixture,
  ConsistencyFixturePage,
  ConsistencyFixtureVariant,
  ConsistencyProbe,
  ConsistencyRuleId,
  CohortKind,
  SharedChromeFingerprint,
  ComputedStyleFingerprint,
  FingerprintCluster,
  StructuralDiffEntry,
  Ui001EvidenceRecord as ConsistencyUi001EvidenceRecord,
} from "./consistency/index.js";

export type {
  RelationsCellEvidence,
  RelationsFixture,
  RelationsFixtureVariant,
  RelationsProbe,
  RelationsRuleId,
  ExtractedRepresentation,
  RelationsWidgetProbe,
  Ui001EvidenceRecord as RelationsUi001EvidenceRecord,
} from "./relations/index.js";

export type {
  SweepsCellEvidence,
  SweepsMatrixEvidence,
  SweepsFixture,
  SweepsFixturePage,
  SweepsFixtureVariant,
  SweepsProbe,
  SweepsRuleId,
  LocaleSweepCheck,
  ResponsiveSweepCheck,
  DimensionObservation,
  Ui001EvidenceRecord as SweepsUi001EvidenceRecord,
} from "./sweeps/index.js";

export type {
  A11yCellEvidence,
  A11yMatrixEvidence,
  A11yFixture,
  A11yFixtureVariant,
  A11yProbe,
  A11yRuleId,
  A11yMediaMode,
  A11yViolationFact,
  DetectorCapabilityRecord,
  DirectA11yCheck,
  ActionSequenceStateCheck,
  ForcedColorsSample,
  Ui001EvidenceRecord as A11yUi001EvidenceRecord,
} from "./a11y/index.js";

export type {
  AssetsCellEvidence,
  AssetsFixture,
  AssetsFixtureVariant,
  AssetsProbe,
  AssetsRuleId,
  ImageObservation,
  ContainerObservation,
  DisabledStylingObservation,
  Ui001EvidenceRecord as AssetsUi001EvidenceRecord,
} from "./assets/index.js";

export type {
  ApplyVisionAdapterInput,
  ApplyVisionAdapterResult,
  VisionAdapter,
  VisionAdapterInput,
  VisionAnnotation,
  VisionEvidenceEnvelope,
  VisionProvenance,
} from "./vision/adapter.js";

async function probeEngine(launcher: BrowserType): Promise<boolean> {
  try {
    const browser = await launcher.launch({ headless: true });
    await browser.close();
    return true;
  } catch {
    return false;
  }
}

/** Runtime browser engine availability for cross-engine capability profiles (UI-A10). */
export async function engineAvailability(): Promise<Record<EngineName, boolean>> {
  const [chromiumOk, firefoxOk, webkitOk] = await Promise.all([
    probeEngine(chromium),
    probeEngine(firefox),
    probeEngine(webkit),
  ]);

  return {
    chromium: chromiumOk,
    firefox: firefoxOk,
    webkit: webkitOk,
  };
}
