// User / Auth types
export interface Agent {
  id: string
  username: string
  role: 'agent' | 'admin'
  created_at: string
  updated_at: string
}

export interface AuthResponse {
  access_token: string
  token_type: string
}

// Project types
export interface Project {
  id: string
  name: string
  description: string | null
  agent_id: string
  created_at: string
  updated_at: string
}

// Folder types
export interface Folder {
  id: string
  name: string
  project_id: string
  parent_id: string | null
  path: string
  created_at: string
  updated_at: string
}

// Document types
export interface Tag {
  id: string
  name: string
  color: string
}

export interface ReasoningStep {
  step: number
  thought: string
  conclusion: string | null
}

export interface DocumentReasoning {
  reasoning_type: 'chain' | 'idea' | 'context' | 'reflection' | null
  confidence: number | null
  reasoning_steps: ReasoningStep[]
  model_source: string | null
}

export interface ReasoningPanelData {
  document_id: string
  has_reasoning: boolean
  reasoning: DocumentReasoning | null
  editable: boolean
}

export interface TipTapContentResponse {
  content: Record<string, unknown>
  format: 'tiptap'
}

export interface ContentUpdateRequest {
  content: Record<string, unknown>
  format: 'tiptap' | 'markdown'
}

export interface Document {
  id: string
  title: string
  content: string
  project_id: string
  folder_id: string | null
  path: string
  tags: Tag[]
  reasoning: DocumentReasoning | null
  tiptap_content: Record<string, unknown> | null
  created_at: string
  updated_at: string
}

// Tree view node
export interface TreeNode {
  id: string
  name: string
  type: 'folder' | 'document'
  children?: TreeNode[]
  parent_id: string | null
}

// API responses
export interface ProjectsResponse {
  projects: Project[]
}

export interface FoldersResponse {
  folders: Folder[]
}

export interface DocumentsResponse {
  documents: Document[]
}

// Graph types
export interface GraphNode {
  id: string
  title: string
  type: 'document'
}

export interface GraphEdge {
  source: string
  target: string
  type: 'reference'
}

export interface GraphStats {
  total_documents: number
  total_references: number
  orphaned_documents: number
}

export interface GraphData {
  project_id: string
  nodes: GraphNode[]
  edges: GraphEdge[]
  stats: GraphStats
}

// Backlinks types
export interface BacklinkItem {
  document_id: string
  title: string
  project_id: string
  project_name: string
  excerpt: string
  updated_at: string
}

export interface BacklinksResponse {
  document_id: string
  backlinks_count: number
  backlinks: BacklinkItem[]
}

export interface OutgoingLinkItem {
  document_id: string
  title: string
  project_id: string
  project_name: string
  exists: boolean
  updated_at: string
}

export interface OutgoingLinksResponse {
  document_id: string
  outgoing_links_count: number
  outgoing_links: OutgoingLinkItem[]
}

export interface DocumentLinkRef {
  document_id: string
  title: string
  anchor_text: string
}

export interface DocumentLinksResponse {
  document_id: string
  outgoing_links: DocumentLinkRef[]
  backlinks: DocumentLinkRef[]
}

// Search / Quick Switcher types
export interface SearchResult {
  id: string
  type: 'document' | 'project'
  title: string
  subtitle: string | null
  highlight: string | null
  icon: string
  project_id?: string
}

export interface SearchResponse {
  query: string
  results: SearchResult[]
  total: number
  search_type: string
}

// Export types
export interface DocumentExportResponse {
  // The API returns the raw file, not JSON
  // This is for type safety on the response
}

export interface ProjectExportResponse {
  // The API returns the raw file, not JSON
}

// Form inputs
export interface LoginForm {
  username: string
  password: string
}

export interface RegisterForm {
  username: string
  password: string
}

export interface ProjectForm {
  name: string
  description: string
}

export interface FolderForm {
  name: string
  parent_id: string | null
}

export interface DocumentForm {
  title: string
  content: string
  folder_id: string | null
}

export interface TagForm {
  name: string
  color: string
}

// API Token types
export type TokenRole = 'researcher' | 'developer' | 'viewer'

export interface ApiToken {
  id: string
  name: string
  role: TokenRole
  created_at: string
}

export interface ApiTokenGenerateResponse {
  token: string
  name: string
  role: TokenRole
}

export interface ApiTokenCreate {
  name: string
  role: TokenRole
}
