import ApiService from "./ApiService";
import { type Vendor } from "./vendorService";
import { type Contractor } from "./contractorService";
import { type Consultant } from "./consultantService";

// Party types - matching backend enum
export type PartyType = "VENDOR" | "CONTRACTOR" | "CONSULTANT";

// Payment interface
export interface PartyPayment {
  payment_type: "FIXED" | "MONTHLY" | "MONTHLY";
  amount: string;
  start_date?: string;
  end_date?: string;
  paid_date?: string;
  notes?: string;
}

// Project Party interfaces
export interface ProjectParty {
  id: string;
  project_id: string;
  party_id: string;
  party_type: PartyType;
  assigned_by: string;
  assigned_at: string;
  spent_hours?: number;
  total_cost?: number;
  party: Vendor | Contractor | Consultant;
  payment?: PartyPayment | null;
}

export interface AssignPartyData {
  party_id: string;
  party_type: PartyType;
  project_id: string;
}

export interface ProjectPartiesResponse {
  success: boolean;
  message?: string;
  data: ProjectParty[];
}

export interface AssignPartyResponse {
  success: boolean;
  message?: string;
  data: ProjectParty;
}

export interface DeletePartyAssignmentResponse {
  success: boolean;
  message?: string;
}

// Get Project Parties
export async function getProjectParties(
  projectId: string,
  partyType?: PartyType
) {
  const params: any = {};

  if (partyType) {
    params.party_type = partyType;
  }

  return ApiService.request<ProjectPartiesResponse>({
    url: `/projects/party-assignments/assigned-parties`,
    method: "get",
    params: {
      project_id: projectId,
      ...params,
    },
  });
}

// Assign Party to Project
export async function assignPartyToProject(data: AssignPartyData) {
  return ApiService.request<AssignPartyResponse>({
    url: `/projects/party-assignments`,
    method: "post",
    data,
  });
}

// Delete Party Assignment
export async function deletePartyAssignment(
  projectId: string,
  partyId: string,
  partyType: PartyType
) {
  return ApiService.request<DeletePartyAssignmentResponse>({
    url: `/projects/party-assignments`,
    method: "delete",
    data: {
      project_id: projectId,
      party_id: partyId,
      party_type: partyType,
    },
  });
}

// Helper functions to get parties for dropdown (reusing existing services)
export async function getVendorsForDropdown() {
  const { getVendors } = await import("./vendorService");
  return getVendors({ limit: 9999 });
}

export async function getContractorsForDropdown() {
  const { getContractors } = await import("./contractorService");
  return getContractors({ limit: 9999 });
}

export async function getConsultantsForDropdown() {
  const { getConsultants } = await import("./consultantService");
  return getConsultants({ limit: 9999 });
}
