import { api } from '../api';

export interface CustomerAddress {
  first_name: string;
  last_name: string;
  company?: string;
  address_1: string;
  address_2?: string;
  city: string;
  state?: string;
  postcode: string;
  country: string;
  phone?: string;
}

export interface CustomerStats {
  total_orders: number;
  total_spent: number;
}

export interface Customer {
  id: number;
  username: string;
  email: string;
  first_name: string;
  last_name: string;
  display_name: string;
  registered: string;
  role: string;
  billing?: CustomerAddress;
  shipping?: CustomerAddress;
  stats?: CustomerStats;
}

export interface CustomerListResponse {
  data: Customer[];
  pagination: {
    total: number;
    total_pages: number;
    current: number;
    per_page: number;
  };
}

export interface CustomerFormData {
  email: string;
  first_name: string;
  last_name: string;
  username?: string;
  password?: string;
  billing?: Partial<CustomerAddress>;
  shipping?: Partial<CustomerAddress>;
  send_email?: boolean;
}

export interface CustomerSearchResult {
  id: number;
  name: string;
  email: string;
}

export const CustomersApi = {
  /**
   * List customers with pagination and filtering
   */
  list: async (params?: {
    page?: number;
    per_page?: number;
    search?: string;
    role?: string;
  }): Promise<CustomerListResponse> => {
    return api.get('/customers', params);
  },

  /**
   * Get single customer
   */
  get: async (id: number): Promise<Customer> => {
    return api.get(`/customers/${id}`);
  },

  /**
   * Create new customer
   */
  create: async (data: CustomerFormData): Promise<Customer> => {
    return api.post('/customers', data);
  },

  /**
   * Update customer
   */
  update: async (id: number, data: Partial<CustomerFormData>): Promise<Customer> => {
    return api.put(`/customers/${id}`, data);
  },

  /**
   * Delete customer
   */
  delete: async (id: number): Promise<void> => {
    return api.del(`/customers/${id}`);
  },

  /**
   * Search customers (for autocomplete)
   */
  search: async (query: string, limit?: number): Promise<CustomerSearchResult[]> => {
    return api.get('/customers/search', { q: query, limit });
  },
};
