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

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

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

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

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

  const status =
    (body.status as TransactionStatus | undefined) ?? 'approved';
  if (!ALLOWED_STATUSES.includes(status)) {
    return useResponseError('状态值不合法', -1);
  }

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

  // 发送Webhook通知（保留原有功能）
  notifyTransactionWebhook(transaction, { action: 'created' }).catch((error) =>
    console.error('[finance][transactions.post] webhook notify failed', error),
  );

  // 发送Telegram通知（新功能）
  try {
    // 获取分类和账户名称
    let categoryName: string | undefined;
    let accountName: string | undefined;

    if (transaction.categoryId) {
      const category = db
        .prepare<{ name: string }>('SELECT name FROM finance_categories WHERE id = ?')
        .get(transaction.categoryId);
      categoryName = category?.name;
    }

    if (transaction.accountId) {
      const account = db
        .prepare<{ name: string }>('SELECT name FROM finance_accounts WHERE id = ?')
        .get(transaction.accountId);
      accountName = account?.name;
    }

    await notifyTransaction(
      {
        id: transaction.id,
        type: transaction.type,
        amount: transaction.amount,
        currency: transaction.currency,
        categoryName,
        accountName,
        transactionDate: transaction.transactionDate,
        description: transaction.description || undefined,
        status: transaction.status,
      },
      'created',
    );
  } catch (error) {
    console.error('[finance][transactions.post] telegram notify failed', error);
  }

  return useResponseSuccess(transaction);
});
