import client from './client';
import type { PaginatedResponse } from './types';

export interface TokenInfo {
  id: string;
  node_id: string;
  status: string;
  created_at: string;
}

export interface ProcessInstanceInfo {
  id: string;
  definition_id: string;
  definition_name?: string;
  business_key?: string;
  status: string;
  started_by: string;
  started_at: string;
  completed_at?: string;
  created_at: string;
  active_tokens: TokenInfo[];
}

export interface StartInstanceRequest {
  definition_id: string;
  business_key?: string;
  variables?: Array<{ name: string; var_type?: string; value: unknown }>;
}

export async function startInstance(req: StartInstanceRequest) {
  const { data } = await client.post<{ success: boolean; data: ProcessInstanceInfo }>(
    '/workflow/instances',
    req,
  );
  return data.data;
}

export async function listInstances(page = 1, pageSize = 20) {
  const { data } = await client.get<{ success: boolean; data: PaginatedResponse<ProcessInstanceInfo> }>(
    '/workflow/instances',
    { params: { page, page_size: pageSize } },
  );
  return data.data;
}

export async function getInstance(id: string) {
  const { data } = await client.get<{ success: boolean; data: ProcessInstanceInfo }>(
    `/workflow/instances/${id}`,
  );
  return data.data;
}

export async function suspendInstance(id: string) {
  const { data } = await client.post<{ success: boolean; data: null }>(
    `/workflow/instances/${id}/suspend`,
  );
  return data.data;
}

export async function resumeInstance(id: string) {
  const { data } = await client.post<{ success: boolean; data: null }>(
    `/workflow/instances/${id}/resume`,
  );
  return data.data;
}

export async function terminateInstance(id: string) {
  const { data } = await client.post<{ success: boolean; data: null }>(
    `/workflow/instances/${id}/terminate`,
  );
  return data.data;
}
