import { readBody } from 'h3';
import {
  createTransaction,
  type TransactionStatus,
} from '~/utils/finance-repository';
import { useResponseError, useResponseSuccess } from '~/utils/response';
import { notifyTransactionWebhook } from '~/utils/telegram-webhook';

const DEFAULT_CURRENCY = 'CNY';
const DEFAULT_STATUS: TransactionStatus = 'pending';
const ALLOWED_STATUSES: TransactionStatus[] = [
  'draft',
  'pending',
  'approved',
  'rejected',
  'paid',
];

export default defineEventHandler(async (event) => {
  const body = await readBody(event);

  if (!body?.amount || !body?.transactionDate) {
    return useResponseError('缺少必填字段', -1);
  }

  const amount = Number(body.amount);
  if (Number.isNaN(amount)) {
    return useResponseError('金额格式不正确', -1);
  }

  const type =
    (body.type as 'expense' | 'income' | 'transfer' | undefined) ?? 'expense';
  const status =
    (body.status as TransactionStatus | undefined) ?? DEFAULT_STATUS;

  if (!ALLOWED_STATUSES.includes(status)) {
    return useResponseError('状态值不合法', -1);
  }

  const reimbursement = createTransaction({
    type,
    amount,
    currency: body.currency ?? DEFAULT_CURRENCY,
    categoryId: body.categoryId ?? null,
    accountId: body.accountId ?? null,
    transactionDate: body.transactionDate,
    description:
      body.description ??
      body.item ??
      (body.notes ? `${body.notes}` : '') ??
      '',
    project: body.project ?? body.category ?? null,
    memo: body.memo ?? body.notes ?? null,
    status,
    reimbursementBatch: body.reimbursementBatch ?? null,
    reviewNotes: body.reviewNotes ?? null,
    submittedBy: body.submittedBy ?? body.requester ?? null,
    approvedBy: body.approvedBy ?? null,
    approvedAt: body.approvedAt ?? null,
    statusUpdatedAt: body.statusUpdatedAt ?? undefined,
  });

  notifyTransactionWebhook(reimbursement, {
    action: 'reimbursement.created',
  }).catch((error) =>
    console.error(
      '[finance][reimbursements.post] webhook notify failed',
      error,
    ),
  );

  return useResponseSuccess(reimbursement);
});
