import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

/**
 * 时间戳转换管道
 * 处理 ThinkPHP 的时间戳字段特性
 * 自动转换时间戳和日期格式
 */
@Injectable()
export class TimestampPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    if (value === null || value === undefined) {
      return value;
    }

    // 如果是字符串日期，转换为时间戳
    if (typeof value === 'string') {
      return this.stringToTimestamp(value);
    }

    // 如果是 Date 对象，转换为时间戳
    if (value instanceof Date) {
      return Math.floor(value.getTime() / 1000);
    }

    // 如果是数字，确保是整数时间戳
    if (typeof value === 'number') {
      return Math.floor(value);
    }

    return value;
  }

  /**
   * 字符串日期转换为时间戳
   */
  private stringToTimestamp(dateStr: string): number {
    const date = new Date(dateStr);
    if (isNaN(date.getTime())) {
      return 0;
    }
    return Math.floor(date.getTime() / 1000);
  }

  /**
   * 时间戳转换为日期字符串
   */
  private timestampToString(timestamp: number): string {
    if (!timestamp || timestamp <= 0) {
      return '';
    }
    return new Date(timestamp * 1000).toISOString();
  }

  /**
   * 时间戳转换为本地时间字符串
   */
  private timestampToLocalString(timestamp: number): string {
    if (!timestamp || timestamp <= 0) {
      return '';
    }
    return new Date(timestamp * 1000).toLocaleString();
  }
}

/**
 * 时间戳转换管道工厂
 */
export class TimestampPipeFactory {
  /**
   * 创建时间戳转换管道
   * @param format 输出格式：'timestamp' | 'iso' | 'local'
   * @returns 转换管道实例
   */
  static create(format: 'timestamp' | 'iso' | 'local' = 'timestamp') {
    return new TimestampPipe();
  }
} 