import type {
  Ticket,
  TicketDetail,
  TicketStats,
  TicketCategory,
  TicketStatusOption,
  TicketPriorityOption,
  UpdateTicketPayload,
  TicketAssignableUser,
  TicketMessage,
  TicketMessageKind,
  TicketDraft,
  TicketHistoryPage,
  CreateTicketMessagePayload,
  SupportInboxCounts,
} from "@/domain/entities/ticket";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";

export interface TicketHistoryQueryParams {
  limit?: number;
  cursor?: number;
}

export interface TicketRepository {
  findAll(params: PaginationQueryParams): Promise<BackendPaginatedData<Ticket>>;
  findById(id: number): Promise<TicketDetail>;
  update(id: number, data: UpdateTicketPayload): Promise<TicketDetail>;
  delete(id: number): Promise<void>;
  getStats(): Promise<TicketStats>;
  getCategories(): Promise<TicketCategory[]>;
  getStatusOptions(): Promise<TicketStatusOption[]>;
  getPriorityOptions(): Promise<TicketPriorityOption[]>;

  // PBI 1 — Assignment
  assign(id: number, userId: number | null): Promise<TicketDetail>;
  getAssignableUsers(q?: string): Promise<TicketAssignableUser[]>;

  // PBI 2 — Messages, drafts, mentions
  getMessages(ticketId: number, kind?: TicketMessageKind): Promise<TicketMessage[]>;
  createMessage(ticketId: number, payload: CreateTicketMessagePayload): Promise<TicketMessage>;
  updateMessage(ticketId: number, messageId: number, body: string): Promise<TicketMessage>;
  deleteMessage(ticketId: number, messageId: number): Promise<void>;
  getDraft(ticketId: number, kind: TicketMessageKind): Promise<TicketDraft | null>;
  upsertDraft(ticketId: number, kind: TicketMessageKind, body: string): Promise<TicketDraft>;
  deleteDraft(ticketId: number, kind: TicketMessageKind): Promise<void>;
  getMentionableUsers(q?: string): Promise<TicketAssignableUser[]>;

  // Support inbox
  getInboxCounts(): Promise<SupportInboxCounts>;
  /** Marks the conversation read for the current agent; resolves with fresh counts. */
  markRead(ticketId: number): Promise<SupportInboxCounts>;

  // PBI 3 — History
  getHistory(ticketId: number, params?: TicketHistoryQueryParams): Promise<TicketHistoryPage>;
}
