import type { UIMessageParts } from "@folo-services/drizzle"

import type { StructuredSuccessResponse } from "../../types"
import type { DateISOString } from "../../types/date-serialization"

// Base request types
export interface ChatIdRequest {
  chatId: string
}

// Base types from Drizzle schema
export interface AIChatSession {
  chatId: string
  userId: string
  title: string
  createdAt: DateISOString
  updatedAt: DateISOString
  lastSeenAt: DateISOString
}

export interface AIChatMessage {
  id: string
  chatId: string
  role: "user" | "assistant" | "system"
  messageParts: UIMessageParts
  metadata?: unknown
  status: "pending" | "completed" | "error"
  createdAt: DateISOString
  finishedAt: DateISOString | null
}

export interface ChatMetadata {
  tokenUsage?: {
    promptTokens: number
    completionTokens: number
    totalTokens: number
  }
  finishReason?: string
  model?: string
  [key: string]: any
}

// Request types
export interface GetSessionRequest extends ChatIdRequest {}

export interface ListSessionsQuery {
  limit?: number // 1-100, default 20
  before?: DateISOString // Optional cursor for pagination
}

export interface UpdateSessionRequest extends ChatIdRequest {
  title: string // 1-100 chars, required
}

export interface DeleteSessionRequest extends ChatIdRequest {}

export interface GetMessagesQuery extends ChatIdRequest {
  limit?: number
  before?: DateISOString // Optional cursor for pagination
}

export interface MarkSeenRequest extends ChatIdRequest {
  lastSeenAt?: DateISOString // Optional timestamp (defaults to now)
}

export interface GetUnreadQuery {
  limit?: number
}

// Response types
export type SessionResponse = StructuredSuccessResponse<AIChatSession>

export type ListSessionsResponse = StructuredSuccessResponse<AIChatSession[]> & {
  total: number
  nextBefore?: DateISOString // Cursor for next page
}

export type GetMessagesResponse = StructuredSuccessResponse<{
  chatSession: AIChatSession | null
  messages: AIChatMessage[]
  nextBefore?: DateISOString // Cursor for next page
}>

export type GetUnreadResponse = StructuredSuccessResponse<string[]> // Array of chatIds
