import { request } from './request';
import type { StorageAttachment } from './supplier';

export interface PageResult<T> { list: T[]; total: number; }
export type PurchaseKind = 'request' | 'order' | 'invoice' | 'payment';

export interface PurchaseItem {
  id?: number;
  productId?: number;
  productName?: string;
  productCode?: string;
  productSpecification?: string;
  productUnitId?: number;
  productUnitName?: string;
  productPrice?: number;
  count?: number;
  taxPercent?: number;
  demandTime?: string;
  qcCheckFlag?: boolean;
  bizType?: number;
  bizId?: number;
  bizNo?: string;
  totalPrice?: number;
  paidPrice?: number;
  paymentPrice?: number;
  remark?: string;
}

export interface PurchaseRecord {
  id?: number;
  no?: string;
  status?: number;
  supplierId?: number;
  supplierName?: string;
  requestUserName?: string;
  requestDeptName?: string;
  requestTime?: string;
  orderTime?: string;
  invoiceTime?: string;
  paymentTime?: string;
  requestReason?: string;
  invoiceNo?: string;
  invoiceTitle?: string;
  purchaseOrderId?: number;
  order?: { id?: number; no?: string };
  invoice?: { no?: string; invoiceNo?: string; remainingInvoicePrice?: number };
  invoiceId?: number;
  accountId?: number;
  accountName?: string;
  financeUserId?: number;
  financeUserName?: string;
  totalCount?: number;
  totalPrice?: number;
  paymentPrice?: number;
  discountPrice?: number;
  discountPercent?: number;
  depositPrice?: number;
  price?: number;
  remainingInvoicePrice?: number;
  sourceType?: number;
  sourceNo?: string;
  sourceId?: number;
  inStatus?: number;
  remark?: string;
  productNames?: string;
  processInstanceId?: string | number;
  orderId?: number;
  orderNo?: string;
  hasAttachment?: boolean;
  blobIds?: number[];
  attachmentList?: StorageAttachment[];
  items?: PurchaseItem[];
}

export interface PurchaseProcess { id?: string; key?: string; processDefinitionKey?: string; name?: string; }
export interface PurchaseInvoiceSimple {
  id: number;
  no?: string;
  invoiceNo?: string;
  invoiceTitle?: string;
  supplierId?: number;
  purchaseOrderId?: number;
  remainingInvoicePrice?: number;
  price?: number;
}
export interface AccountSimple { id: number; name: string; no?: string; defaultStatus?: boolean; }
export interface UserSimple { id: number; nickname?: string; username?: string; }

const config: Record<PurchaseKind, { endpoint: string; permission: string }> = {
  request: { endpoint: 'purchase-request', permission: 'erp:purchase-request' },
  order: { endpoint: 'purchase-order', permission: 'erp:purchase-order' },
  invoice: { endpoint: 'purchase-invoice', permission: 'erp:purchase-invoice' },
  payment: { endpoint: 'finance-payment', permission: 'erp:finance-payment' },
};
function authHeader(accessToken: string) { return { Authorization: `Bearer ${accessToken}` }; }
function query(params: Record<string, string | number | undefined>) {
  const content = Object.entries(params).filter(([, value]) => value !== undefined && value !== '')
    .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join('&');
  return content ? `?${content}` : '';
}
function base(kind: PurchaseKind) { return `/erp/${config[kind].endpoint}`; }
export function getPurchasePermission(kind: PurchaseKind) { return config[kind].permission; }
export function getPurchasePage(accessToken: string, kind: PurchaseKind, params: { pageNo: number; pageSize: number; no?: string; supplierId?: number; status?: number; bizNo?: string }) {
  return request<PageResult<PurchaseRecord>>(`${base(kind)}/page${query(params)}`, { header: authHeader(accessToken) });
}
export function getPurchase(accessToken: string, kind: PurchaseKind, id: number) {
  return request<PurchaseRecord>(`${base(kind)}/get${query({ id })}`, { header: authHeader(accessToken) });
}
export function createPurchase(accessToken: string, kind: PurchaseKind, data: PurchaseRecord) {
  return request<number>(`${base(kind)}/create`, { method: 'POST', data, header: authHeader(accessToken) });
}
export function updatePurchase(accessToken: string, kind: PurchaseKind, data: PurchaseRecord) {
  return request<boolean>(`${base(kind)}/update`, { method: 'PUT', data, header: authHeader(accessToken) });
}
export function deletePurchase(accessToken: string, kind: PurchaseKind, id: number) {
  return request<boolean>(`${base(kind)}/delete${query(kind === 'invoice' ? { id } : { ids: id })}`, { method: 'DELETE', header: authHeader(accessToken) });
}
export function getPurchaseProcessList(accessToken: string, kind: 'request' | 'order' | 'payment', id?: number) {
  return request<PurchaseProcess[]>(`${base(kind)}/approve-process-list${query({ id })}`, { header: authHeader(accessToken) });
}
export function submitPurchase(accessToken: string, kind: 'request' | 'order' | 'payment', id: number, processDefinitionKey: string) {
  return request<boolean>(`${base(kind)}/submit${query({ id, processDefinitionKey })}`, { method: kind === 'request' ? 'PUT' : 'POST', data: kind === 'request' ? undefined : {}, header: authHeader(accessToken) });
}
export function updatePurchaseOrderStatus(accessToken: string, id: number, status: number) {
  return request<boolean>(`${base('order')}/update-status${query({ id, status })}`, { method: 'PUT', header: authHeader(accessToken) });
}
export function reverseApprovePurchaseOrder(accessToken: string, processInstanceId: string | number) {
  return request<boolean>(`${base('order')}/reverse-approve${query({ processInstanceId })}`, { method: 'POST', data: {}, header: authHeader(accessToken) });
}
export function confirmPurchaseReceipt(accessToken: string, id: number) {
  return request<number>(`${base('order')}/confirm-receipt${query({ id })}`, { method: 'POST', data: {}, header: authHeader(accessToken) });
}
export function generatePurchaseOrder(accessToken: string, id: number, supplierId: number) {
  return request<number>(`${base('request')}/generate-order${query({ id, supplierId })}`, { method: 'POST', data: {}, header: authHeader(accessToken) });
}
export function getPurchaseOrderPage(accessToken: string, params: { pageNo: number; pageSize: number; status?: number }) {
  return request<PageResult<PurchaseRecord>>(`${base('order')}/page${query(params)}`, { header: authHeader(accessToken) });
}
export function getPurchaseInvoiceSimpleList(accessToken: string, supplierId: number, purchaseOrderId?: number) {
  return request<PurchaseInvoiceSimple[]>(`${base('invoice')}/simple-list${query({ supplierId, purchaseOrderId })}`, { header: authHeader(accessToken) });
}
export function getAccountSimpleList(accessToken: string) {
  return request<AccountSimple[]>('/erp/account/simple-list', { header: authHeader(accessToken) });
}
export function getSimpleUserList(accessToken: string) {
  return request<UserSimple[]>('/system/user/simple-list', { header: authHeader(accessToken) });
}
