/**
 * 处方数据验证工具类
 * 职责：统一管理处方数据验证逻辑
 */
export class PrescriptionValidator {
  /**
   * 验证处方数据
   * @param {Object} params - 验证参数
   * @param {number} params.category - 处方类型
   * @param {Array} params.drugs - 药品列表
   * @param {Array} params.diagnoses - 诊断列表
   * @param {string} params.medicalAdvice - 医嘱
   * @param {Object} params.chineseConfig - 中药配置（仅中药需要）
   * @returns {Object} { valid: boolean, message: string }
   */
  static validatePrescriptionData(params) {
    const {
      category,
      drugs,
      diagnoses,
      medicalAdvice,
      chineseConfig,
      requireOnlineTcm,
      onlineTcmDiseasesId,
      onlineTcmMethodId,
      onlineTcmSyndromeId,
      skipDiagnosisAndAdvice,
    } = params;

    // 验证药品
    if (!drugs || drugs.length === 0) {
      return {
        valid: false,
        message: '请添加药品'
      };
    }

    // 传方模式跳过诊断与医嘱校验
    if (!skipDiagnosisAndAdvice) {
      if (!diagnoses || diagnoses.length === 0) {
        return {
          valid: false,
          message: '请添加诊断'
        };
      }
      if (!medicalAdvice || medicalAdvice.trim() === '') {
        return {
          valid: false,
          message: '请输入医嘱'
        };
      }
    }

    // 验证中药配置
    if (category === 1 && chineseConfig) {
      const chineseValidation = this.validateChineseMedicineConfig(chineseConfig);
      if (!chineseValidation.valid) {
        return chineseValidation;
      }
    }

    // 在线复诊 + 中药：证候/治法/中医疾病（与 PC diseases_id、method_id、syndrome_id 一致）
    if (requireOnlineTcm) {
      if (onlineTcmDiseasesId == null || onlineTcmDiseasesId === '') {
        return { valid: false, message: '请选择中医证候' };
      }
      if (onlineTcmMethodId == null || onlineTcmMethodId === '') {
        return { valid: false, message: '请选择中医治法' };
      }
      if (onlineTcmSyndromeId == null || onlineTcmSyndromeId === '') {
        return { valid: false, message: '请选择中医疾病' };
      }
    }

    return {
      valid: true,
      message: '验证通过'
    };
  }

  /**
   * 验证中药配置
   * @param {Object} config - 中药配置
   * @param {number} config.ruleType - 规则类型：1=自制剂，2=委托调剂
   * @param {number} config.packageMethodId - 包法ID（自制剂需要）
   * @param {number} config.processRuleId - 制剂ID（委托调剂需要）
   * @param {number} config.childProcessRuleId - 煎法ID（委托调剂需要）
   * @param {number} config.processRuleNoteId - 备注ID（委托调剂需要）
   * @returns {Object} { valid: boolean, message: string }
   */
  static validateChineseMedicineConfig(config) {
    const { ruleType, packageMethodId, processRuleId, childProcessRuleId, processRuleNoteId } = config;

    if (ruleType === 1) {
      // 自制剂：需要包法
      if (!packageMethodId) {
        return {
          valid: false,
          message: '请选择包法'
        };
      }
    } else if (ruleType === 2) {
      // 委托调剂：需要制剂、煎法、备注
      if (!processRuleId) {
        return {
          valid: false,
          message: '请选择制剂'
        };
      }
      if (!childProcessRuleId) {
        return {
          valid: false,
          message: '请选择煎法'
        };
      }
      if (!processRuleNoteId) {
        return {
          valid: false,
          message: '请选择备注'
        };
      }
    }

    return {
      valid: true,
      message: '验证通过'
    };
  }

  /**
   * 验证药品是否已存在
   * @param {Array} drugs - 当前药品列表
   * @param {Object} newDrug - 新药品
   * @returns {boolean} 是否已存在
   */
  static isDrugExists(drugs, newDrug) {
    if (!drugs || !newDrug) {
      return false;
    }
    // 通过药品ID判断
    const drugId = newDrug.id || newDrug.drug_id;
    return drugs.some(drug => (drug.id || drug.drug_id) === drugId);
  }

  /**
   * 验证诊断是否已存在
   * @param {Array} diagnoses - 当前诊断列表
   * @param {Object} newDiagnosis - 新诊断
   * @returns {boolean} 是否已存在
   */
  static isDiagnosisExists(diagnoses, newDiagnosis) {
    if (!diagnoses || !newDiagnosis) {
      return false;
    }
    // 通过诊断ID或名称判断
    const diagnosisId = newDiagnosis.id || newDiagnosis.disease_id;
    const diagnosisName = newDiagnosis.name;
    return diagnoses.some(diagnosis => 
      (diagnosis.id || diagnosis.disease_id) === diagnosisId || 
      diagnosis.name === diagnosisName
    );
  }
}
