/** START extension contract. Only the TART radio adapter is operational. */
export type Modality = 'radio' | 'microwave' | 'submillimeter' | 'infrared' | 'optical' | 'ultraviolet' | 'xray' | 'gamma' | 'astrometry' | 'gravitational-wave';
export interface Provenance {
  provider: string; telescope?: string; station?: string; observationId: string | null;
  sourceAPI: string | null; retrievalTimestamp: string | null;
  upstreamErrors?: Record<string, string>; originalPayloadPreserved: boolean;
}
export interface Element {
  id: string | number; label: string; type: string;
  coordinates: [number, number, number] | null;
  receiverAssociation: string | null; operationalState: string;
  orientation: unknown | null; frequencyRange: unknown | null;
  metadata: Record<string, unknown>;
}
export interface Geometry {
  frame: string; units: string; elements: Element[];
  baselineRelationships: {id:string; elementIds:(string | number)[]}[];
  orientation: unknown; location: unknown | null;
}
export interface Product {
  id:string; type:string; processingLevel:string;
  sourceUrl?:string | null; originalProductIdentifier?:string | null;
  sourceProduct?:string; dimensions?:number[]; calibratedFlux?:boolean;
}
export interface RadioObservationData {
  visibilities:{id:string;i:number;j:number;re:number;im:number}[];
  antennaPositions:([number,number,number] | null)[];
  stationInfo:Record<string,unknown>; upstreamCalibration:unknown | null; predictedObjects:unknown | null;
}
/** Proposed payloads are distinct; no such products are currently loaded. */
export interface OpticalObservationData {
  imageProducts:Product[]; filters?:string[]; exposureSeconds?:number;
  spectra?:Product[]; catalogueProducts?:Product[];
}
export interface HighEnergyObservationData {
  photonEventProducts:Product[]; imageProducts:Product[];
  energyBand?:{min:number;max:number;unit:string}; exposureProducts?:Product[];
}
export interface GravitationalWaveObservationData {
  eventId:string; detectors:string[]; strainProducts:Product[];
  localizationProducts:Product[]; eventTime:string; timeUncertaintySeconds?:number;
}
export interface CatalogObservationData {catalogueProducts:Product[];referenceEpoch?:string;coordinateFrame:string;}
export type ModalityData = {radio:RadioObservationData} | {optical:OpticalObservationData} | {highEnergy:HighEnergyObservationData} | {gravitationalWave:GravitationalWaveObservationData} | {catalog:CatalogObservationData};
export interface Observation {
  schemaVersion:'start.observation/1'; id:string; provider:string; mission:string | null;
  instrument:{id:string;name:string;type:string;geometryRef?:string}; modality:Modality;
  target:unknown; coordinates:{frame:string;celestialWCS:unknown | null;[key:string]:unknown};
  startTime:string | null; endTime:string | null;
  spectralDomain:{type:string;value?:number | null;unit?:string;[key:string]:unknown} | null;
  processingLevel:string; calibrationState:Record<string,unknown>; geometry:Geometry | null;
  measurements:Record<string,unknown>; products:Product[]; provenance:Provenance;
  modalityData:ModalityData; capabilities:Record<string,boolean>;
  visualization:{renderer:string;layers:ObservationLayer[]}; originalData:unknown;
  registration?:{validated:boolean;targetFrame:string;method?:string;provenance?:unknown};
}
export interface ObservationLayer {
  id:string; observationId:string; product:string; provider:string; instrument:string;
  observationTime:string | null; spectralDomain:unknown; processingLevel:string;
  calibrationState:string; provenance:unknown; enabled:boolean; opacity:number;
  displayMapping:string; coordinateFrame:string; registration:unknown | null;
}
/** An association must preserve evidence; time/space coincidence is not confirmation. */
export interface EventContext {
  id:string; provider:string; eventTime:string; timeUncertaintySeconds:number | null;
  localizationProducts:Product[];
  associations:{observationId:string;relation:'candidate'|'published-counterpart';evidenceSource:string;timeOffsetSeconds:number | null}[];
  provenance:Provenance;
}
export interface ObservationRenderer {
  update(observation:Observation):void; clear():void;
}
