import { DataSource, Repository } from 'typeorm';
import { FeieConfigMt } from '../entities/feie-config.mt.entity';

/**
 * 打印配置服务
 */
export class ConfigService {
  private configRepository: Repository<FeieConfigMt>;

  constructor(dataSource: DataSource) {
    this.configRepository = dataSource.getRepository(FeieConfigMt);
  }

  /**
   * 获取租户的所有打印配置
   */
  async getPrintConfigs(tenantId: number): Promise<FeieConfigMt[]> {
    try {
      const configs = await this.configRepository.find({
        where: { tenantId },
        order: { configKey: 'ASC' }
      });

      // 如果没有配置，返回空数组
      return configs || [];
    } catch (error) {
      console.error(`[租户${tenantId}] 获取打印配置失败:`, error);
      throw new Error('获取打印配置失败');
    }
  }

  /**
   * 获取单个配置项
   */
  async getPrintConfig(tenantId: number, configKey: string): Promise<FeieConfigMt | null> {
    try {
      const config = await this.configRepository.findOne({
        where: { tenantId, configKey }
      });

      return config || null;
    } catch (error) {
      console.error(`[租户${tenantId}] 获取配置项失败，key: ${configKey}:`, error);
      throw new Error('获取配置项失败');
    }
  }

  /**
   * 更新打印配置
   */
  async updatePrintConfig(
    tenantId: number,
    configKey: string,
    configValue: string
  ): Promise<FeieConfigMt> {
    try {
      // 查找现有配置
      let config = await this.configRepository.findOne({
        where: { tenantId, configKey }
      });

      if (config) {
        // 更新现有配置
        config.configValue = configValue;
        config.updatedAt = new Date();
        await this.configRepository.save(config);
      } else {
        // 创建新配置
        config = this.configRepository.create({
          tenantId,
          configKey,
          configValue,
          configType: this.guessConfigType(configValue),
          description: this.getConfigDescription(configKey)
        });
        await this.configRepository.save(config);
      }

      return config;
    } catch (error) {
      console.error(`[租户${tenantId}] 更新配置失败，key: ${configKey}:`, error);
      throw new Error('更新配置失败');
    }
  }

  /**
   * 根据配置值猜测配置类型
   */
  private guessConfigType(configValue: string): string {
    // 首先检查是否为数字（纯数字，不是JSON数字）
    if (!isNaN(Number(configValue)) && configValue.trim() !== '' && !configValue.includes('{') && !configValue.includes('[')) {
      return 'NUMBER';
    }

    // 检查是否为布尔值
    if (configValue.toLowerCase() === 'true' || configValue.toLowerCase() === 'false') {
      return 'BOOLEAN';
    }

    // 尝试解析为JSON
    try {
      JSON.parse(configValue);
      return 'JSON';
    } catch {
      // 不是JSON
    }

    // 默认为字符串
    return 'STRING';
  }

  /**
   * 获取配置项描述
   */
  private getConfigDescription(configKey: string): string {
    const descriptions: Record<string, string> = {
      'feie.anti_refund_delay': '支付成功后等待确认无退款的时间（秒）',
      'feie.receipt_template': '小票打印的模板内容',
      'feie.shipping_template': '发货单打印的模板内容'
    };

    return descriptions[configKey] || '打印配置项';
  }
}