export type ReviewMode = 'comment' | 'browse';
export type CommentStatus = 'open' | 'resolved';
export type ScreenshotState = 'captured' | 'partial' | 'unavailable';

export interface ReviewSettings {
  restUrl: string;
  pluginUrl?: string;
  reviewParam: string;
  csrfToken?: string;
  isMobile: boolean;
  session?: {
    id?: string | number;
    csrfToken?: string | null;
    expiresAt?: string;
    guestName?: string;
    isOwner?: boolean;
  } | null;
  admin?: {
    nonce: string;
  } | null;
}

export interface Anchor {
  url: string;
  title: string;
  selector: string;
  domPath: string;
  textFingerprint: string;
  relativeX: number;
  relativeY: number;
  documentX: number;
  documentY: number;
  viewportWidth: number;
  viewportHeight: number;
  scrollX: number;
  scrollY: number;
  devicePixelRatio: number;
  zoomEstimate: number;
}

export interface ReviewComment {
  id: number;
  /** A review-scoped, never-reused identifier shown to reviewers. */
  commentNumber?: number;
  pageId?: number;
  url?: string;
  pageTitle?: string;
  parentId?: number | null;
  authorName: string;
  authorSessionId?: number;
  body: string;
  bodyHtml?: string;
  status: CommentStatus;
  createdAt: string;
  updatedAt?: string;
  anchor: Anchor;
  isOwn?: boolean;
  placementUncertain?: boolean;
  screenshotState?: ScreenshotState;
  assets?: ReviewAsset[];
  messages?: ReviewMessage[];
}

export interface ReviewAsset {
  id: number;
  commentId: number;
  messageId?: number | null;
  mimeType: 'image/jpeg' | 'image/png' | 'image/webp' | 'application/pdf' | string;
  originalName: string;
  byteSize: number;
  disposition: 'transient' | 'promoted' | 'deleted' | string;
  mediaAttachmentId?: number | null;
  mediaUrl?: string | null;
  createdAt: string;
  kind: 'attachment' | 'screenshot';
}

export interface ReviewMessage {
  id: number;
  commentId: number;
  authorName: string;
  body: string;
  bodyHtml?: string;
  createdAt: string;
  editedAt?: string | null;
  isOwn?: boolean;
}

export interface ReviewPage {
  id: number;
  url: string;
  title: string;
  comments: ReviewComment[];
}

export interface BootstrapResponse {
  notificationsEnabled?: boolean;
  review: {
    id: string;
    state?: 'active' | 'paused' | 'ended';
    status?: 'active' | 'paused' | 'ended';
    title?: string;
  } | null;
  session: ReviewSettings['session'];
  csrfToken?: string;
  guestName?: string;
  isOwner?: boolean;
  comments: ReviewComment[];
  pages?: ReviewPage[];
  now?: string;
}

export interface DraftComment {
  anchor: Anchor;
  x: number;
  y: number;
}
