import { apiClient } from '@/shared/api/client' import type { ApiResponse, PaginatedResult } from '@/shared/types/types' import type { HandoffStatus, OrderStatus, SettlementStatus } from '@/shared/types/status' export interface Order { id: number order_no: string listing_id: number listing_no: string account_id: number owner_id: number renter_id: number owner_phone?: string renter_phone?: string title: string server_region: string login_platform: string rented_at?: string estimated_duration_hours: number price_role?: 'renter' | 'owner' | 'admin' | string display_amount_cent: number /** @deprecated use display_amount_cent */ display_amount?: number rent_amount_cent?: number /** @deprecated use rent_amount_cent */ rent_amount?: number owner_rent_amount_cent?: number /** @deprecated use owner_rent_amount_cent */ owner_rent_amount?: number deposit_amount_cent: number /** @deprecated use deposit_amount_cent */ deposit_amount?: number deposit_original_amount_cent: number /** @deprecated use deposit_original_amount_cent */ deposit_original_amount?: number deposit_waived_amount_cent: number /** @deprecated use deposit_waived_amount_cent */ deposit_waived_amount?: number platform_fee_cent?: number /** @deprecated use platform_fee_cent */ platform_fee?: number account_snapshot?: Record listing_snapshot?: string checkout_info?: string counter_info?: string status: OrderStatus handoff_status: HandoffStatus settlement_status: SettlementStatus checkout?: Checkout payment_deadline_at?: string created_at: string updated_at: string } export interface Checkout { id: number order_id: number initiated_by: number status: SettlementStatus price_role?: 'renter' | 'owner' | 'admin' | string display_amount_cent: number /** @deprecated use display_amount_cent */ display_amount?: number rent_amount_cent?: number /** @deprecated use rent_amount_cent */ rent_amount?: number owner_rent_amount_cent?: number /** @deprecated use owner_rent_amount_cent */ owner_rent_amount?: number platform_fee_cent?: number deposit_amount_cent: number /** @deprecated use deposit_amount_cent */ deposit_amount?: number consumable_amount_cent: number /** @deprecated use consumable_amount_cent */ consumable_amount?: number coin_consumed_m: number other_amount_cent: number /** @deprecated use other_amount_cent */ other_amount?: number deposit_deduct_amount_cent: number /** @deprecated use deposit_deduct_amount_cent */ deposit_deduct_amount?: number renter_refund_amount_cent?: number /** @deprecated use renter_refund_amount_cent */ renter_refund_amount?: number owner_income_amount_cent?: number /** @deprecated use owner_income_amount_cent */ owner_income_amount?: number content: string evidence_urls: string[] owner_adjustment_reason: string owner_adjusted_at?: string renter_confirmed_at?: string renter_rejected_at?: string created_at: string updated_at: string } export interface HandoffRecord { id: number order_id: number from_user_id: number to_user_id: number type: string content: string confirmed_by_renter_at?: string confirmed_by_owner_at?: string created_at: string } export interface PaymentOrder { id: number payment_no: string order_id: number order_no: string provider: string third_order_id: string provider_order_id: string pay_way: string jspay_flag: string amount_cent: number status: string td_code?: string jspay_url?: string jspay_info?: string paid: boolean paid_at?: string created_at: string updated_at: string } export interface CheckoutPayload { consumable_amount: number coin_consumed_m: number other_amount: number deposit_deduct_amount?: number content: string evidence_urls: string[] reason?: string } export interface RefundStatus { order_id: number order_no: string refund_status: string refund_amount_cent: number refunded_at?: string total_amount_cent: number } export interface AdminActionResponse { updated?: boolean closed?: boolean refunded?: boolean } export async function fetchOrders() { const { data } = await apiClient.get>('/orders') return data.data } export async function fetchOrder(id: string | number) { const { data } = await apiClient.get>(`/orders/${id}`) return data.data } export async function createOrder(listingId: number) { const { data } = await apiClient.post>('/orders', { listing_id: listingId }) return data.data } export async function cancelOrder(id: number) { const { data } = await apiClient.post>(`/orders/${id}/cancel`) return data.data } export async function fetchHandoffRecords(id: string | number) { const { data } = await apiClient.get>(`/orders/${id}/handoff-records`) return data.data ?? [] } export async function submitHandoff(id: number, content: string) { const { data } = await apiClient.post>(`/orders/${id}/handoff`, { content }) return data.data } export async function confirmReceive(id: number) { const { data } = await apiClient.post>( `/orders/${id}/confirm-receive` ) return data.data } export async function startOrderPayment( orderId: number, options: { pay_way?: string; jspay_flag?: string } = {} ) { const { data } = await apiClient.post>( `/orders/${orderId}/start-payment`, { pay_way: options.pay_way || '', jspay_flag: options.jspay_flag || '', } ) return data.data } export async function queryOrderPayment(orderId: number) { const { data } = await apiClient.get>(`/orders/${orderId}/query-payment`) return data.data } export async function submitCheckout(orderId: number, payload: CheckoutPayload) { const { data } = await apiClient.post>(`/orders/${orderId}/checkout`, payload) return data.data } export async function confirmCheckout(orderId: number) { const { data } = await apiClient.post>( `/orders/${orderId}/checkout/confirm` ) return data.data } export async function acceptCheckout(orderId: number) { const { data } = await apiClient.post>( `/orders/${orderId}/checkout/accept` ) return data.data } export async function rejectCheckout(orderId: number, reason?: string) { const { data } = await apiClient.post>( `/orders/${orderId}/checkout/reject`, { reason: reason || '' } ) return data.data } export async function counterCheckout(orderId: number, payload: CheckoutPayload) { const { data } = await apiClient.post>( `/orders/${orderId}/checkout/counter`, payload ) return data.data } export async function fetchAdminOrders(page = 1, pageSize = 20) { const { data } = await apiClient.get>>('/admin/orders', { params: { page, page_size: pageSize }, }) const result = data.data return { items: Array.isArray(result?.items) ? result.items : [], total: Number(result?.total ?? 0), page: Number(result?.page ?? page), page_size: Number(result?.page_size ?? pageSize), } } export async function fetchAdminOrder(id: string | number) { const { data } = await apiClient.get>(`/admin/orders/${id}`) return data.data } export async function fetchAdminHandoffRecords(id: string | number) { const { data } = await apiClient.get>( `/admin/orders/${id}/handoff-records` ) return data.data ?? [] } export async function adminCloseOrder(id: number, reason: string) { const { data } = await apiClient.post>(`/admin/orders/${id}/close`, { reason, }) return data.data } export async function adminMarkOrderAbnormal(id: number, reason: string) { const { data } = await apiClient.post>( `/admin/orders/${id}/mark-abnormal`, { reason } ) return data.data } export async function adminRefundOrder(id: number) { const { data } = await apiClient.post>(`/admin/orders/${id}/refund`) return data.data } export async function adminRefundStatus(id: number) { const { data } = await apiClient.get>( `/admin/orders/${id}/refund-status` ) return data.data } // Backward-compatible names kept for existing pages/composables. export const startPayment = (orderId: number, payWay: string, jsPayFlag?: string) => startOrderPayment(orderId, { pay_way: payWay, jspay_flag: jsPayFlag }) export const queryPayment = queryOrderPayment export const createCheckout = submitCheckout export const confirmHandoff = confirmReceive