import client from './client';

export interface ImportSession {
  id: string;
  state: 'pending' | 'reviewing' | 'completed' | 'failed' | 'transient';
  created_at: string;
  updated_at: string;
  source_file?: string;
}

export interface ImportPreview {
  session: ImportSession;
  preview: {
    hosts: Array<{ domain_names: string; [key: string]: unknown }>;
    conflicts: string[];
    errors: string[];
  };
  caddyfile_content?: string;
  conflict_details?: Record<string, {
    existing: {
      forward_scheme: string;
      forward_host: string;
      forward_port: number;
      ssl_forced: boolean;
      websocket: boolean;
      enabled: boolean;
    };
    imported: {
      forward_scheme: string;
      forward_host: string;
      forward_port: number;
      ssl_forced: boolean;
      websocket: boolean;
    };
  }>;
}

export const uploadCaddyfile = async (content: string): Promise<ImportPreview> => {
  const { data } = await client.post<ImportPreview>('/import/upload', { content });
  return data;
};

export const uploadCaddyfilesMulti = async (contents: string[]): Promise<ImportPreview> => {
  const { data } = await client.post<ImportPreview>('/import/upload-multi', { contents });
  return data;
};

export const getImportPreview = async (): Promise<ImportPreview> => {
  const { data } = await client.get<ImportPreview>('/import/preview');
  return data;
};

export interface ImportCommitResult {
  created: number;
  updated: number;
  skipped: number;
  errors: string[];
}

export const commitImport = async (
  sessionUUID: string,
  resolutions: Record<string, string>,
  names: Record<string, string>
): Promise<ImportCommitResult> => {
  const { data } = await client.post<ImportCommitResult>('/import/commit', {
    session_uuid: sessionUUID,
    resolutions,
    names,
  });
  return data;
};

export const cancelImport = async (): Promise<void> => {
  await client.post('/import/cancel');
};

export const getImportStatus = async (): Promise<{ has_pending: boolean; session?: ImportSession }> => {
  // Note: Assuming there might be a status endpoint or we infer from preview.
  // If no dedicated status endpoint exists in backend, we might rely on preview returning 404 or empty.
  // Based on previous context, there wasn't an explicit status endpoint mentioned in the simple API,
  // but the hook used `importAPI.status()`. I'll check the backend routes if needed.
  // For now, I'll implement it assuming /import/preview can serve as status check or there is a /import/status.
  // Let's check the backend routes to be sure.
  try {
    const { data } = await client.get<{ has_pending: boolean; session?: ImportSession }>('/import/status');
    return data;
  } catch {
    // Fallback if status endpoint doesn't exist, though the hook used it.
    return { has_pending: false };
  }
};
