import { HttpClient } from '../utils/http-client.ts';

export interface TagSuggestion {
  /**
   * If present, then this suggestion is for a tag alias.
   * If absent, then this suggestion is for the `canonical` tag name.
   */
  alias?: null | string;

  /**
   * The canonical name of the tag (non-alias).
   */
  canonical: string;

  /**
   * Number of images tagged with this tag.
   */
  images: number;
}

export interface GetTagSuggestionsResponse {
  suggestions: TagSuggestion[];
}

export interface GetTagSuggestionsRequest {
  /**
   * Term to complete.
   */
  term: string;

  /**
   * Maximum number of suggestions to return.
   */
  limit: number;
}

/**
 * Autocomplete API client for Philomena backend.
 */
export class AutocompleteClient {
  private http: HttpClient = new HttpClient();

  /**
   * Fetches server-side tag suggestions for the given term. The provided incomplete
   * term is expected to be normalized by the caller (i.e. lowercased and trimmed).
   * This is because the caller is responsible for caching the normalized term.
   */
  async getTagSuggestions(request: GetTagSuggestionsRequest): Promise<GetTagSuggestionsResponse> {
    return this.http.fetchJson('/autocomplete/tags', {
      query: {
        vsn: '2',
        term: request.term,
        limit: request.limit.toString(),
      },
    });
  }

  /**
   * Issues a GET request to fetch the compiled autocomplete index.
   */
  async getCompiledAutocomplete(): Promise<ArrayBuffer> {
    const now = new Date();
    const key = `${now.getUTCFullYear()}-${now.getUTCMonth()}-${now.getUTCDate()}`;

    const response = await this.http.fetch(`/autocomplete/compiled`, {
      query: { vsn: '2', key },
      credentials: 'omit',
      cache: 'force-cache',
    });

    return response.arrayBuffer();
  }
}