import 'package:hmg_patient_app/widgets/data_display/medical/LabResult/newUI/labWidgets.dart';

class LabResultList {
  String? filterName = "";
  String? description = "";
  List<LabResult>? patientLabResultList = [];

  LabResultList({this.filterName, this.description, LabResult? lab}) {
    patientLabResultList!.add(lab!);
  }
}

enum ResultFlag {
  N('normal'),
  H('high'),
  L('low'),
  CL('criticalLow'),
  CH('criticalHigh'),
  HCH('highCriticalHigh'),
  LCL('lowCriticalLow'),
  IRR('interpretive');

  final String value;

  const ResultFlag(this.value);

  static ResultFlag? fromJson(String key, num? resultValueFlag) {
    ///these lines are added cause the result flag is coupled with two values
    ///if resultvalueflag is empty or line carriage then it has to be interpretive
    // if (resultValueFlag == null) return ResultFlag.IRR;
    // if(resultValueFlag == 5) return ResultFlag.IRR;
    switch (key) {
      case 'N':
        return ResultFlag.N;
      case 'H':
        return ResultFlag.H;
      case 'L':
        return ResultFlag.L;
      case 'CL':
        return ResultFlag.CL;
      case 'CH':
        return ResultFlag.CH;
      case 'HCH':
        return ResultFlag.HCH;
      case 'LCL':
        return ResultFlag.LCL;
      case '':
        return ResultFlag.IRR;
      default:
        return null;
    }
  }

  String toJson() {
    switch (this) {
      case ResultFlag.N:
        return 'N';
      case ResultFlag.H:
        return 'H';
      case ResultFlag.L:
        return 'L';
      case ResultFlag.CL:
        return 'CL';
      case ResultFlag.CH:
        return 'CH';
      case ResultFlag.HCH:
        return 'HCH';
      case ResultFlag.LCL:
        return 'LCL';
      case ResultFlag.IRR:
        return '';
    }
  }

  ResultTypes getType() {
    switch (this) {
      case ResultFlag.N:
        return ResultTypes.normal;
      case ResultFlag.H:
        return ResultTypes.high;
      case ResultFlag.L:
        return ResultTypes.low;
      case ResultFlag.CL:
        return ResultTypes.criticalLow;
      case ResultFlag.CH:
        return ResultTypes.criticalHigh;
      case ResultFlag.HCH:
        return ResultTypes.highCriticalHigh;
      case ResultFlag.LCL:
        return ResultTypes.lowCriticalLow;
      case ResultFlag.IRR:
        return ResultTypes.IRR;
    }
  }
}

class LabResult {
  String? description;
  dynamic femaleInterpretativeData;
  int? gender;
  bool? isCertificateAllowed;
  int? lineItemNo;
  dynamic maleInterpretativeData;
  dynamic notes;
  int? orderLineItemNo;
  int? orderNo;
  String? packageID;
  int? patientID;
  String? projectID;
  String? referanceRange;
  String? resultValue;
  int? resultValueBasedLineItemNo;
  String? resultValueFlag;
  String? sampleCollectedOn;
  String? sampleReceivedOn;
  String? setupID;
  dynamic superVerifiedOn;
  String? testCode;
  String? uOM;
  String? verifiedOn;
  String? packageShortDescription;
  String? testShortDescription;
  ResultFlag? calculatedResultFlag;
  dynamic verifiedOnDateTime;
  num? percentage;
  num? width;
  num? resultTypeID;

  LabResult(
      {this.description,
        this.femaleInterpretativeData,
        this.gender,
        this.isCertificateAllowed,
        this.lineItemNo,
        this.maleInterpretativeData,
        this.notes,
        this.orderLineItemNo,
        this.orderNo,
        this.packageID,
        this.patientID,
        this.projectID,
        this.referanceRange,
        this.resultValue,
        this.resultValueBasedLineItemNo,
        this.resultValueFlag,
        this.sampleCollectedOn,
        this.sampleReceivedOn,
        this.setupID,
        this.superVerifiedOn,
        this.testCode,
        this.uOM,
        this.verifiedOn,
        this.verifiedOnDateTime});

  LabResult.fromJson(Map<String, dynamic> json, {String? flag}) {
    description = json['Description'];
    femaleInterpretativeData = json['FemaleInterpretativeData'];
    gender = json['Gender'];
    isCertificateAllowed = json['IsCertificateAllowed'];
    lineItemNo = json['LineItemNo'];
    maleInterpretativeData = json['MaleInterpretativeData'];
    notes = json['Notes'];
    orderLineItemNo = json['OrderLineItemNo'];
    orderNo = json['OrderNo'];
    packageID = json['PackageID'];
    patientID = json['PatientID'];
    projectID = json['ProjectID'];
    referanceRange = json['ReferanceRange'];
    resultValue = json['ResultValue'];
    resultValueBasedLineItemNo = json['ResultValueBasedLineItemNo'];
    resultValueFlag = json['ResultValueFlag'];
    sampleCollectedOn = json['SampleCollectedOn'];
    sampleReceivedOn = json['SampleReceivedOn'];
    setupID = json['SetupID'];
    superVerifiedOn = json['SuperVerifiedOn'];
    testCode = json['TestCode'];
    uOM = json['UOM'];
    verifiedOn = json['VerifiedOn'];
    verifiedOnDateTime = json['VerifiedOnDateTime'];
    packageShortDescription = json['PackageShortDescription'];
    testShortDescription = json['TestShortDescription'];
    resultTypeID = json['ResultTypeID'];
    calculatedResultFlag = ResultFlag.fromJson(flag ?? json['CalculatedResultFlag'], resultTypeID);
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['Description'] = this.description;
    data['FemaleInterpretativeData'] = this.femaleInterpretativeData;
    data['Gender'] = this.gender;
    data['IsCertificateAllowed'] = this.isCertificateAllowed;
    data['LineItemNo'] = this.lineItemNo;
    data['MaleInterpretativeData'] = this.maleInterpretativeData;
    data['Notes'] = this.notes;
    data['OrderLineItemNo'] = this.orderLineItemNo;
    data['OrderNo'] = this.orderNo;
    data['PackageID'] = this.packageID;
    data['PatientID'] = this.patientID;
    data['ProjectID'] = this.projectID;
    data['ReferanceRange'] = this.referanceRange;
    data['ResultValue'] = this.resultValue;
    data['ResultValueBasedLineItemNo'] = this.resultValueBasedLineItemNo;
    data['ResultValueFlag'] = this.resultValueFlag;
    data['SampleCollectedOn'] = this.sampleCollectedOn;
    data['SampleReceivedOn'] = this.sampleReceivedOn;
    data['SetupID'] = this.setupID;
    data['SuperVerifiedOn'] = this.superVerifiedOn;
    data['TestCode'] = this.testCode;
    data['UOM'] = this.uOM;
    data['VerifiedOn'] = this.verifiedOn;
    data['VerifiedOnDateTime'] = this.verifiedOnDateTime;
    data['PackageShortDescription'] = this.packageShortDescription;
    data['TestShortDescription'] = this.testShortDescription;
    data['CalculatedResultFlag'] = this.calculatedResultFlag?.toJson() ?? '';

    return data;
  }

  bool shouldShowResultBarAndGraph() {
    if (resultTypeID == null) return false;
    if (resultTypeID == 6) return false;

    return true;
  }
}
