import { client } from '../client' import { API } from '../endpoints' import type { Invoice, CreateInvoicePayload } from '@/scripts/types/domain/invoice' import type { ApiResponse, PaginatedResponse, ListParams, DateRangeParams, NextNumberResponse, DeletePayload, } from '@/scripts/types/api' export interface InvoiceListParams extends ListParams, DateRangeParams { status?: string customer_id?: number } export interface InvoiceListMeta { current_page: number last_page: number per_page: number total: number invoice_total_count: number } export interface InvoiceListResponse { data: Invoice[] meta: InvoiceListMeta } export interface SendInvoicePayload { id: number subject?: string | null body?: string | null from?: string | null to?: string | null cc?: string | null bcc?: string | null } export interface InvoiceStatusPayload { id: number status: string } export interface SendPreviewParams { id: number from?: string | null to?: string | null cc?: string | null bcc?: string | null subject?: string | null body?: string | null } export interface InvoiceTemplate { name: string path: string } export interface InvoiceTemplatesResponse { invoiceTemplates: InvoiceTemplate[] } export const invoiceService = { async list(params?: InvoiceListParams): Promise { const { data } = await client.get(API.INVOICES, { params }) return data }, async get(id: number): Promise> { const { data } = await client.get(`${API.INVOICES}/${id}`) return data }, async create(payload: CreateInvoicePayload): Promise> { const { data } = await client.post(API.INVOICES, payload) return data }, async update(id: number, payload: Partial): Promise> { const { data } = await client.put(`${API.INVOICES}/${id}`, payload) return data }, async delete(payload: DeletePayload): Promise<{ success: boolean }> { const { data } = await client.post(API.INVOICES_DELETE, payload) return data }, async send(payload: SendInvoicePayload): Promise> { const { data } = await client.post(`${API.INVOICES}/${payload.id}/send`, payload) return data }, async sendPreview(params: SendPreviewParams): Promise> { const { data } = await client.get(`${API.INVOICES}/${params.id}/send/preview`, { params }) return data }, async clone(id: number): Promise> { const { data } = await client.post(`${API.INVOICES}/${id}/clone`) return data }, async convertToEstimate(id: number): Promise>> { const { data } = await client.post(`${API.INVOICES}/${id}/convert-to-estimate`) return data }, async changeStatus(payload: InvoiceStatusPayload): Promise> { const { data } = await client.post(`${API.INVOICES}/${payload.id}/status`, payload) return data }, async getNextNumber(params?: { key?: string }): Promise { const { data } = await client.get(API.NEXT_NUMBER, { params: { key: 'invoice', ...params } }) return data }, async getTemplates(): Promise { const { data } = await client.get(API.INVOICE_TEMPLATES) return data }, }