/**
 * 业务单号生成服务
 * 根据 API 文档规范 - 生成唯一的业务单号
 * 
 * 格式：{formKey}_{year}_{sequence}
 * 示例：expense_form_2025_0001
 */

import { Injectable, Logger } from '@nestjs/common';
import { PrismaService } from '@core/database/prisma/prisma.service';

@Injectable()
export class FormBusinessKeyService {
  private readonly logger = new Logger(FormBusinessKeyService.name);

  constructor(private readonly prisma: PrismaService) {}

  /**
   * 生成业务单号
   * @param formKey 表单 key
   * @returns 唯一的业务单号
   */
  async generateBusinessKey(formKey: string): Promise<string> {
    const year = new Date().getFullYear();
    const prefix = `${formKey}_${year}_`;

    // 获取当前最大序号
    const lastInstance = await this.prisma.formInstance.findFirst({
      where: {
        businessKey: {
          startsWith: prefix,
        },
      },
      orderBy: {
        businessKey: 'desc',
      },
      select: {
        businessKey: true,
      },
    });

    let nextSequence = 1;
    if (lastInstance?.businessKey) {
      // 从业务单号中提取序号
      const parts = lastInstance.businessKey.split('_');
      const lastSequence = parseInt(parts[parts.length - 1], 10);
      if (!isNaN(lastSequence)) {
        nextSequence = lastSequence + 1;
      }
    }

    const businessKey = `${prefix}${String(nextSequence).padStart(4, '0')}`;
    
    this.logger.debug(`Generated business key: ${businessKey}`);
    return businessKey;
  }

  /**
   * 验证业务单号是否唯一
   * @param businessKey 业务单号
   * @returns 是否唯一
   */
  async isBusinessKeyUnique(businessKey: string): Promise<boolean> {
    const existing = await this.prisma.formInstance.findUnique({
      where: { businessKey },
      select: { id: true },
    });
    return !existing;
  }

  /**
   * 解析业务单号
   * @param businessKey 业务单号
   * @returns 解析后的信息
   */
  parseBusinessKey(businessKey: string): {
    formKey: string;
    year: number;
    sequence: number;
  } | null {
    const parts = businessKey.split('_');
    if (parts.length < 3) {
      return null;
    }

    const sequence = parseInt(parts[parts.length - 1], 10);
    const year = parseInt(parts[parts.length - 2], 10);
    const formKey = parts.slice(0, -2).join('_');

    if (isNaN(sequence) || isNaN(year)) {
      return null;
    }

    return { formKey, year, sequence };
  }
}
