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

export interface NodeDef {
  id: string;
  type: 'StartEvent' | 'EndEvent' | 'UserTask' | 'ServiceTask' | 'ExclusiveGateway' | 'ParallelGateway';
  name: string;
  assignee_id?: string;
  candidate_groups?: string[];
  service_type?: string;
  position?: { x: number; y: number };
}

export interface EdgeDef {
  id: string;
  source: string;
  target: string;
  condition?: string;
  label?: string;
}

export interface ProcessDefinitionInfo {
  id: string;
  name: string;
  key: string;
  version: number;
  category?: string;
  description?: string;
  nodes: NodeDef[];
  edges: EdgeDef[];
  status: string;
  created_at: string;
  updated_at: string;
}

export interface CreateProcessDefinitionRequest {
  name: string;
  key: string;
  category?: string;
  description?: string;
  nodes: NodeDef[];
  edges: EdgeDef[];
}

export interface UpdateProcessDefinitionRequest {
  name?: string;
  category?: string;
  description?: string;
  nodes?: NodeDef[];
  edges?: EdgeDef[];
  version: number;
}

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

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

export async function createProcessDefinition(req: CreateProcessDefinitionRequest) {
  const { data } = await client.post<{ success: boolean; data: ProcessDefinitionInfo }>(
    '/workflow/definitions',
    req,
  );
  return data.data;
}

export async function updateProcessDefinition(id: string, req: UpdateProcessDefinitionRequest) {
  const { data } = await client.put<{ success: boolean; data: ProcessDefinitionInfo }>(
    `/workflow/definitions/${id}`,
    req,
  );
  return data.data;
}

export async function publishProcessDefinition(id: string) {
  const { data } = await client.post<{ success: boolean; data: ProcessDefinitionInfo }>(
    `/workflow/definitions/${id}/publish`,
  );
  return data.data;
}
