import type {
  HelpArticle,
  HelpArticleBlockLibrary,
  HelpArticleStats,
  HelpCategoryOption,
  HelpTone,
  CreateHelpArticlePayload,
  UpdateHelpArticlePayload
} from "@/domain/entities/help-article";

export interface HelpArticleFindAllOptions {
  all?: boolean;
  page?: number;
  per_page?: number;
  search?: string;
  sort_by?: string;
  sort_dir?: "asc" | "desc";
  order_by?: string;
  order?: "ASC" | "DESC";
}

export interface HelpArticlesPaginatorMeta {
  current_page: number;
  last_page: number;
  per_page: number;
  total: number;
  from?: number | null;
  to?: number | null;
}

export interface HelpArticlesResponse {
  data: HelpArticle[];
  meta?: HelpArticlesPaginatorMeta;
  links?: Record<string, string | null>;
}

export interface HelpArticleBlocksOptions {
  /** Tints the blocks with the tone of the category the article belongs to. */
  help_category_id?: string | number;
  /** Direct tone override, when the category is not known yet. */
  tone?: HelpTone;
}

export interface HelpArticleRepository {
  findAll(options?: HelpArticleFindAllOptions): Promise<HelpArticlesResponse>;
  findById(id: string | number): Promise<HelpArticle>;
  create(payload: CreateHelpArticlePayload): Promise<HelpArticle>;
  update(id: string | number, payload: UpdateHelpArticlePayload): Promise<HelpArticle>;
  delete(id: string | number): Promise<void>;
  getStats(): Promise<HelpArticleStats>;
  getCategoryOptions(): Promise<HelpCategoryOption[]>;
  getBlocks(options?: HelpArticleBlocksOptions): Promise<HelpArticleBlockLibrary>;
}
