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

/**
 * 特殊字符处理管道
 * 处理 ThinkPHP 的特殊字符转义特性
 * 自动转义和反转义特殊字符
 */
@Injectable()
export class SpecialCharacterPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    if (value === null || value === undefined) {
      return value;
    }

    // 如果是字符串，处理特殊字符
    if (typeof value === 'string') {
      return this.escapeSpecialCharacters(value);
    }

    // 如果是对象，递归处理所有字符串字段
    if (typeof value === 'object') {
      return this.processObject(value);
    }

    return value;
  }

  /**
   * 转义特殊字符
   */
  private escapeSpecialCharacters(str: string): string {
    return str
      .replace(/\\/g, '\\\\')
      .replace(/'/g, "\\'")
      .replace(/"/g, '\\"')
      .replace(/\n/g, '\\n')
      .replace(/\r/g, '\\r')
      .replace(/\t/g, '\\t');
  }

  /**
   * 反转义特殊字符
   */
  private unescapeSpecialCharacters(str: string): string {
    return str
      .replace(/\\n/g, '\n')
      .replace(/\\r/g, '\r')
      .replace(/\\t/g, '\t')
      .replace(/\\"/g, '"')
      .replace(/\\'/g, "'")
      .replace(/\\\\/g, '\\');
  }

  /**
   * 处理对象中的字符串字段
   */
  private processObject(obj: any): any {
    if (Array.isArray(obj)) {
      return obj.map(item => this.processObject(item));
    }

    if (obj !== null && typeof obj === 'object') {
      const result: any = {};
      for (const [key, value] of Object.entries(obj)) {
        result[key] = this.processObject(value);
      }
      return result;
    }

    return obj;
  }
}

/**
 * 特殊字符处理管道工厂
 */
export class SpecialCharacterPipeFactory {
  /**
   * 创建特殊字符处理管道
   * @param mode 处理模式：'escape' | 'unescape'
   * @returns 转换管道实例
   */
  static create(mode: 'escape' | 'unescape' = 'escape') {
    return new SpecialCharacterPipe();
  }
} 