/**
 * Tasks board engine TypeScript types — tasks-board-engine.
 * Shared between API handlers and React components.
 */

// ── String literal unions ────────────────────────────────────────────────────

export type TaskPriority = 'low' | 'medium' | 'high' | 'urgent'

export type TaskSource =
  | 'manual'
  | 'email'
  | 'telegram'
  | 'slack'
  | 'whatsapp'
  | 'trello'
  | 'asana'
  | 'jira'
  | 'monday'
  | 'clickup'

// ── Domain objects (JSON-serialized) ─────────────────────────────────────────

export interface TaskStatusObject {
  id: string
  tenant_id: string
  project_id: string | null
  name: string
  color: string
  position: number
  is_terminal: boolean
  created_at: string
}

export interface TaskObject {
  id: string
  tenant_id: string
  project_id: string | null
  status_id: string
  title: string
  description: unknown | null  // Tiptap JSONB
  priority: TaskPriority
  assignee_id: string | null
  reporter_id: string
  due_date: string | null      // ISO date string 'YYYY-MM-DD'
  estimated_hours: number | null
  source: TaskSource
  external_id: string | null
  position: number
  actual_hours?: number
  labels: string[]
  created_at: string
  updated_at: string
}

export interface TaskSyncSettingsObject {
  id: string
  tenant_id: string
  sync_interval_minutes: number
  auto_create_tickets_from: {
    email?: boolean
    telegram?: boolean
    slack?: boolean
    whatsapp?: boolean
  }
  default_project_id: string | null
  created_at: string
  updated_at: string
}

// ── Filter / query params ────────────────────────────────────────────────────

export interface TaskFilters {
  project?: string
  status?: string[]
  priority?: string[]
  assignee?: string
  source?: string[]
  dueFrom?: string
  dueTo?: string
  labels?: string[]
  q?: string
}

// ── Mutation input shapes ────────────────────────────────────────────────────

export interface CreateTaskInput {
  title: string
  project_id?: string | null
  status_id: string
  priority?: TaskPriority
  assignee_id?: string | null
  reporter_id: string
  due_date?: string | null
  estimated_hours?: number | null
  source?: TaskSource
  external_id?: string | null
  position?: number
  description?: unknown | null
  labels?: string[]
}

export interface UpdateTaskInput {
  title?: string
  project_id?: string | null
  status_id?: string
  priority?: TaskPriority
  assignee_id?: string | null
  due_date?: string | null
  estimated_hours?: number | null
  position?: number
  description?: unknown | null
  labels?: string[]
}

export interface CreateTaskStatusInput {
  name: string
  color: string
  project_id?: string | null
  is_terminal?: boolean
}

export interface UpdateTaskStatusInput {
  name?: string
  color?: string
  is_terminal?: boolean
}
