export interface ServiceAccountCredentials {
  type?: string;
  project_id?: string;
  private_key_id?: string;
  private_key: string;
  client_email: string;
  client_id?: string;
  auth_uri?: string;
  token_uri?: string;
}

export interface IndexingNotificationResult {
  success: boolean;
  status: number;
  url: string;
  type: 'URL_UPDATED' | 'URL_DELETED';
  dryRun?: boolean;
  data?: any;
  error?: string;
  details?: any;
  timestamp: string;
}

export interface BatchIndexingResult {
  total: number;
  successful: number;
  failed: number;
  quotaWarning: string | null;
  durationMs: number;
  results: IndexingNotificationResult[];
}

export interface IndexingServiceOptions {
  credentials?: ServiceAccountCredentials | string | null;
  keyPath?: string | null;
  dryRun?: boolean;
  quiet?: boolean;
  defaultType?: 'URL_UPDATED' | 'URL_DELETED';
  indexingClient?: any;
  authClient?: any;
}

export function loadServiceAccountCredentials(options?: IndexingServiceOptions): {
  credentials: ServiceAccountCredentials | null;
  keyPath: string | null;
  source: string;
};

export function createIndexingClient(options?: IndexingServiceOptions): Promise<{
  indexing: any;
  auth: any;
  source: string;
}>;

export function publishUrlNotification(
  url: string,
  type?: 'URL_UPDATED' | 'URL_DELETED',
  options?: IndexingServiceOptions
): Promise<IndexingNotificationResult>;

export function getUrlNotificationStatus(
  url: string,
  options?: IndexingServiceOptions
): Promise<IndexingNotificationResult>;

export function batchPublishUrls(
  urls: Array<string | { url: string; type?: 'URL_UPDATED' | 'URL_DELETED' }>,
  delayMs?: number,
  options?: IndexingServiceOptions
): Promise<BatchIndexingResult>;

export class GoogleIndexingService {
  constructor(options?: IndexingServiceOptions);
  publishUrl(
    url: string,
    type?: 'URL_UPDATED' | 'URL_DELETED',
    overrideOptions?: IndexingServiceOptions
  ): Promise<IndexingNotificationResult>;
  publishBatch(
    urls: Array<string | { url: string; type?: string }>,
    delayMs?: number,
    overrideOptions?: IndexingServiceOptions
  ): Promise<BatchIndexingResult>;
  getStatus(
    url: string,
    overrideOptions?: IndexingServiceOptions
  ): Promise<IndexingNotificationResult>;
}

export const DAILY_PUZZLE_PAGES: Array<{ slug: string; name: string }>;

export function getTodayNewYorkDate(): string;

export function getDailyIndexingState(): Record<string, string>;

export function saveDailyIndexingState(state: Record<string, string>): void;

export function pingDailyPuzzleUpdated(
  slug: string,
  dateStr?: string,
  options?: IndexingServiceOptions & { force?: boolean }
): Promise<any>;

export function pingAllDailyPuzzlePages(
  options?: IndexingServiceOptions & { force?: boolean }
): Promise<any>;

export function hasDynamicPlaceholders(str?: string | null): boolean;

export function interpolateDynamicPlaceholders(
  template: string | undefined | null,
  context: {
    dateStr?: string;
    monDay?: string;
    monthDayYear?: string;
    weekday?: string;
    year?: string;
    puzzleNumber?: number | null;
    gameName?: string;
  }
): string;

export default GoogleIndexingService;
