/**
 * SAP 字段映射配置
 * 移植自 Python: config/sap_mapping.py
 *
 * 管理钉钉宜搭采购表单 → SAP 采购申请单的字段映射规则
 */

// ==================== 数据接口 ====================

export interface PurchaseFormData {
  formInstanceId: string;
  processInstanceId: string;
  serialNumber: string;
  // 申请人
  applicantName: string;
  applicantEmployeeId: string;
  applicantId: string;
  applicantDept: string;
  applicationDate: string;
  // 公司
  companyName: string;
  purchasingCompanyName: string;
  // 采购
  purchaser: string;
  expectedCompletionDate: string;
  // 需求
  demandInitiator: string;
  demandCategory: string;
  // 预算
  budgetNumber: string;
  budgetAmount: number;
  // 描述与财务
  purchaseProjectDescription: string;
  materialGroup: string;
  costCenterNumber: string;
  fixedAssetsNumber: string;
  generalLedgerAccount: string;
  // 审批链
  approverChain: string;
}

export interface SapSyncResult {
  success: boolean;
  alreadyExists: boolean;
  prNumber: string | null;
  messages: Array<{ type: string; message: string }>;
  rawResponse: Record<string, any> | null;
}

// ==================== 字段长度限制 ====================

const FIELD_MAX_LENGTH: Record<string, number> = {
  PR_TYPE: 4,
  DESCRIPTION: 40,
  HEADER_NOTE: 660,
  LINE_ITEM_NUMBER: 5,
  ACCT_ASSIGNMNT_CAT: 1,
  SHORT_TEXT: 40,
  QUANTITITY: 13,
  PRICE: 11,
  CURRENCY: 5,
  UNIT: 3,
  PLANT: 4,
  MATERIAL_GROUP: 9,
  REQUISITIONER: 12,
  ITEM_TEXT: 660,
  GL_ACCOUNT: 10,
  COST_CENTER: 10,
  COST_CONTROL_AREA: 4,
  TRACKING_NUMBER: 10,
  PURCHASE_GROUP: 3,
};

function truncate(value: string, field: string): string {
  const max = FIELD_MAX_LENGTH[field];
  return max ? value.slice(0, max) : value;
}

function extractBeforeDash(value: string): string {
  if (!value) return '';
  const idx = value.indexOf('-');
  return idx >= 0 ? value.slice(0, idx).trim() : value.trim();
}

// ==================== Header 构建 ====================

export function buildSapHeader(data: PurchaseFormData): Record<string, string> {
  return {
    PR_TYPE: 'FO',
    DESCRIPTION: truncate(`${data.applicantName}发起的采购申请单`, 'DESCRIPTION'),
    HEADER_NOTE: truncate(data.approverChain || '', 'HEADER_NOTE'),
  };
}

// ==================== Item 构建 ====================

export function buildSapItem(data: PurchaseFormData): Record<string, string | number> {
  // 账户分配类别：费用化→K，固定资产→F
  let acctAssignmentCat = '';
  if (data.demandCategory === '费用化') acctAssignmentCat = 'K';
  else if (data.demandCategory === '固定资产') acctAssignmentCat = 'F';

  const item: Record<string, string | number> = {
    // 固定默认值
    LINE_ITEM_NUMBER: '10',
    QUANTITITY: '1',
    CURRENCY: 'CNY',
    UNIT: 'EA',
    COST_CONTROL_AREA: '3000',
    PRICE: data.budgetAmount,
    PURCHASE_GROUP: '805',
    // 动态映射
    ACCT_ASSIGNMNT_CAT: acctAssignmentCat,
    SHORT_TEXT: truncate(data.budgetNumber || '', 'SHORT_TEXT'),
    REQUISITIONER: truncate(data.applicantName || '', 'REQUISITIONER'),
    ITEM_TEXT: truncate(data.purchaseProjectDescription || '', 'ITEM_TEXT'),
    TRACKING_NUMBER: truncate(data.serialNumber || '', 'TRACKING_NUMBER'),
    MATERIAL_GROUP: truncate(extractBeforeDash(data.materialGroup), 'MATERIAL_GROUP'),
    GL_ACCOUNT: truncate(extractBeforeDash(data.generalLedgerAccount), 'GL_ACCOUNT'),
    COST_CENTER: truncate(data.costCenterNumber || data.fixedAssetsNumber || '', 'COST_CENTER'),
    PLANT: truncate(extractBeforeDash(data.purchasingCompanyName), 'PLANT'),
  };

  // 交货日期（可选）
  const deliveryDate = parseDeliveryDate(data.expectedCompletionDate);
  if (deliveryDate) {
    item.DELIVERY_DATE = deliveryDate;
  }

  return item;
}

// ==================== 辅助 ====================

function parseDeliveryDate(value: string | undefined): string | null {
  if (!value) return null;
  const dateStr = value.includes(' ') ? value.split(' ')[0] : value;
  if (dateStr.length === 10 && dateStr[4] === '-' && dateStr[7] === '-') {
    return dateStr;
  }
  return null;
}
