import api from './client';
import type {
  SmsMessage,
  CallRecord,
  LeadTouchpoint,
  OptOutRecord,
  LeadMetrics,
} from '../types';

// ---------------------------------------------------------------------------
// SMS API
// ---------------------------------------------------------------------------

export interface SendSmsPayload {
  to_phone: string;
  body: string;
  lead_id?: string;
}

export interface SendSmsResponse {
  success: boolean;
  sms_id: string;
  status: string;
  provider_sid: string;
  to_phone: string;
  body: string;
}

export interface MessagesResponse {
  messages: SmsMessage[];
  total: number;
  limit: number;
  offset: number;
}

// ---------------------------------------------------------------------------
// Call API
// ---------------------------------------------------------------------------

export interface TriggerCallPayload {
  to_phone: string;
  lead_id?: string;
  twiml_url?: string;
}

export interface TriggerCallResponse {
  success: boolean;
  call_id: string;
  status: string;
  provider_sid: string;
  to_phone: string;
}

export interface CallsResponse {
  calls: CallRecord[];
  total: number;
  limit: number;
  offset: number;
}

// ---------------------------------------------------------------------------
// Timeline API
// ---------------------------------------------------------------------------

export interface TimelineResponse {
  lead_id: string;
  lead_status: string;
  touchpoints: LeadTouchpoint[];
  total: number;
}

// ---------------------------------------------------------------------------
// Opt-Out API
// ---------------------------------------------------------------------------

export interface OptOutsResponse {
  opt_outs: OptOutRecord[];
  total: number;
  limit: number;
  offset: number;
}

export interface AddOptOutPayload {
  phone: string;
  reason: 'stop' | 'manual' | 'bounced' | 'complaint';
}

// ---------------------------------------------------------------------------
// Metrics API
// ---------------------------------------------------------------------------

export interface MetricsResponse {
  lead_id: string;
  lead_created_at: string | null;
  time_to_first_contact_minutes: number | null;
  time_to_first_sms_minutes: number | null;
  time_to_first_call_minutes: number | null;
  first_contact_type: string | null;
  first_contact_at: string | null;
}

// ---------------------------------------------------------------------------
// smsCallApi
// ---------------------------------------------------------------------------

export const smsCallApi = {
  // --- SMS ---

  sendSms: async (payload: SendSmsPayload): Promise<SendSmsResponse> => {
    const { data } = await api.post<SendSmsResponse>('/api/sms/send', payload);
    return data;
  },

  listMessages: async (params?: {
    lead_id?: string;
    direction?: 'inbound' | 'outbound';
    status?: string;
    phone?: string;
    limit?: number;
    offset?: number;
  }): Promise<MessagesResponse> => {
    const { data } = await api.get<MessagesResponse>('/api/sms/messages', { params });
    return data;
  },

  getMessage: async (messageId: string): Promise<SmsMessage> => {
    const { data } = await api.get<SmsMessage>(`/api/sms/messages/${messageId}`);
    return data;
  },

  // --- Calls ---

  triggerCall: async (payload: TriggerCallPayload): Promise<TriggerCallResponse> => {
    const { data } = await api.post<TriggerCallResponse>('/api/sms/call', payload);
    return data;
  },

  listCalls: async (params?: {
    lead_id?: string;
    disposition?: string;
    limit?: number;
    offset?: number;
  }): Promise<CallsResponse> => {
    const { data } = await api.get<CallsResponse>('/api/sms/calls', { params });
    return data;
  },

  updateCallDisposition: async (
    callId: string,
    disposition: string,
  ): Promise<{ success: boolean }> => {
    const { data } = await api.put<{ success: boolean }>(
      `/api/sms/calls/${callId}/disposition`,
      { disposition },
    );
    return data;
  },

  // --- Timeline ---

  getLeadTimeline: async (leadId: string): Promise<TimelineResponse> => {
    const { data } = await api.get<TimelineResponse>(`/api/sms/leads/${leadId}/timeline`);
    return data;
  },

  // --- Opt-Outs ---

  listOptOuts: async (params?: {
    limit?: number;
    offset?: number;
  }): Promise<OptOutsResponse> => {
    const { data } = await api.get<OptOutsResponse>('/api/sms/opt-outs', { params });
    return data;
  },

  addOptOut: async (payload: AddOptOutPayload): Promise<{ success: boolean }> => {
    const { data } = await api.post<{ success: boolean }>('/api/sms/opt-outs', payload);
    return data;
  },

  removeOptOut: async (optOutId: string): Promise<{ success: boolean; removed_phone: string }> => {
    const { data } = await api.delete<{ success: boolean; removed_phone: string }>(
      `/api/sms/opt-outs/${optOutId}`,
    );
    return data;
  },

  // --- Metrics ---

  getLeadMetrics: async (leadId: string): Promise<MetricsResponse> => {
    const { data } = await api.get<MetricsResponse>(`/api/sms/leads/${leadId}/metrics`);
    return data;
  },
};
