import { UseCase } from "@/core/domain/use-case";
import { Either, left, right } from "@/core/logic/either";
import { ApiClientProvider } from "@/providers/api-client-provider";
import { GpuCloudInstance } from "../../domain/instance/instance";
import { ListLaunchedInstancesError } from "./errors/list-launched-instances-error";

export class ListLaunchedInstances
  implements UseCase<void, GpuCloudInstance[], ListLaunchedInstancesError>
{
  constructor(private readonly apiClient: ApiClientProvider) {}

  async execute(): Promise<
    Either<ListLaunchedInstancesError, GpuCloudInstance[]>
  > {
    try {
      const instances = await this.apiClient.request<GpuCloudInstance[]>(
        "/gpu-cloud/instances"
      );

      return right(instances ?? []);
    } catch (error) {
      return left(
        new ListLaunchedInstancesError(
          error instanceof Error ? error.message : "Unexpected error occurred."
        )
      );
    }
  }
}
