// Fix: Broke a circular dependency by defining the AgentName type directly in this file instead of importing it.
export type AgentName = 'Risk & Control Agent' | 'Brand Agent' | 'Channel Best Practices Agent' | 'Channel Tech Specs Agent';

// RBAC types
export type UserRole = 'super_admin' | 'oversight_admin' | 'agency_admin' | 'basic_user';

export interface AppUser {
  id: string;
  email: string;
  name: string;
  role: UserRole;
  agencyId: string | null;
  agencyName: string | null;
}

export type AgentStatus = 'pending' | 'in-progress' | 'complete' | 'issues-found' | 'error';

export type ReviewStatus = {
    [key in AgentName]?: AgentStatus;
};

export type RagStatus = 'Red' | 'Amber' | 'Green' | 'Error';

export interface SubReview {
    ragStatus: RagStatus;
    feedback: string;
    issues: string[];
    // Revision-aware fields (populated when analyzing version N > 1)
    resolvedIssues?: string[];
    outstandingIssues?: string[];
    newIssues?: string[];
}

export type OverallStatus = 'Passed' | 'Failed' | 'Analysis Error' | 'Requires Manual Legal Review';

export interface AgentReview {
    legalAgentReview: SubReview;
    brandAgentReview: SubReview;
    channelBestPracticesAgentReview: SubReview;
    channelTechSpecsAgentReview: SubReview;
    leadAgentSummary: string;
    overallStatus: OverallStatus;
    financialPromotionReason?: string;
}

export interface FlaggedItem {
  id: string;
  campaignName: string;
  proofName: string;
  version: number;
  submitter: string;
  submitAgency: string;
  agentFlagged: string;
  comments: string;
  timestamp: string;
}

export interface ResolvedItem {
  id: string;
  campaignName: string;
  proofName: string;
  version: number;
  submitter: string;
  submitAgency: string;
  agent: string;
  issue: string;
  resolution: string;
  timestamp: string;
}

export interface ErrorItem {
  id: string;
  campaignName: string;
  proofName: string;
  version: number;
  submitter: string;
  submitAgency: string;
  errorSummary: string;
  timestamp: string;
}

export interface PDFPage {
  page: number;
  data_url: string;
  width: number;
  height: number;
}

export interface ProofVersion {
  version: number;
  timestamp: string;
  workfrontId: string;
  proofPreviewUrl?: string;
  fileStorageKey?: string;
  feedback: AgentReview;
  isIdenticalFile?: boolean;
}

// Knowledge Base types
export interface KnowledgeBaseListItem {
  id: string;
  agent_key: string;
  display_name: string;
  description: string | null;
  source_document_count: number;
  active_spec_version: number | null;
  active_spec_char_count: number | null;
  latest_job_status: string | null;
  latest_job_completed_at: string | null;
  created_at: string;
}

export interface SourceDocument {
  id: string;
  knowledge_base_id: string;
  filename: string;
  file_storage_key: string;
  file_size_bytes: number;
  mime_type: string;
  uploaded_by_name: string | null;
  parse_status: string;
  parse_error: string | null;
  created_at: string;
}

export interface ProcessingJob {
  id: string;
  knowledge_base_id: string;
  status: string;
  triggered_by_name: string | null;
  total_documents: number;
  parsed_documents: number;
  spec_version_id: string | null;
  error_message: string | null;
  started_at: string | null;
  completed_at: string | null;
  created_at: string;
}

export interface KnowledgeBaseDetail {
  id: string;
  agent_key: string;
  display_name: string;
  description: string | null;
  source_documents: SourceDocument[];
  active_spec_version: number | null;
  active_spec_char_count: number | null;
  latest_job: ProcessingJob | null;
  created_at: string;
}

export interface SpecVersionListItem {
  id: string;
  knowledge_base_id: string;
  version_number: number;
  generated_by_name: string | null;
  source_document_ids: string[] | null;
  is_active: boolean;
  char_count: number;
  created_at: string;
}

export interface SpecVersionDetail extends SpecVersionListItem {
  content: string;
}

export interface DiffLine {
  type: 'add' | 'remove' | 'context';
  content: string;
  line_number_old: number | null;
  line_number_new: number | null;
}

export interface DiffResult {
  version_a: number;
  version_b: number;
  additions: number;
  deletions: number;
  lines: DiffLine[];
}
