package xyz.driver.pdsuicommon.utils
import java.time.{LocalDate, LocalDateTime}
import io.swagger.models.properties.Property
import spray.json.JsValue
import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.formats.json.sprayformats.ListResponse._
import xyz.driver.core.swagger.CustomSwaggerJsonConverter._
import xyz.driver.entities.patient.CancerType
import xyz.driver.pdsuicommon.concurrent.BridgeUploadQueue
import xyz.driver.pdsuidomain.entities.export.patient.ExportPatientWithLabels
import xyz.driver.pdsuidomain.entities.export.trial.ExportTrialWithLabels
import xyz.driver.pdsuidomain.fakes.entities.common
import xyz.driver.pdsuidomain.formats.json.sprayformats.ListResponse
import xyz.driver.pdsuidomain.formats.json.sprayformats.bridgeuploadqueue._
import xyz.driver.pdsuidomain.formats.json.sprayformats.record._
import xyz.driver.pdsuidomain.formats.json.sprayformats.document._
import xyz.driver.pdsuidomain.services.CriterionService.RichCriterion
import xyz.driver.pdsuidomain.services.ExtractedDataService.RichExtractedData
import xyz.driver.pdsuidomain.services.PatientCriterionService.{DraftPatientCriterion, RichPatientCriterion}
import xyz.driver.pdsuidomain.services.PatientEligibleTrialService.RichPatientEligibleTrial
import xyz.driver.pdsuidomain.services.PatientHypothesisService.RichPatientHypothesis
import xyz.driver.pdsuidomain.services.PatientLabelService.RichPatientLabel
import scala.collection.immutable
object CustomSwaggerJsonFormats {
val customCommonProperties = immutable.Map[Class[_], Property](
classOf[LocalDateTime] -> stringProperty(example = Some("2010-12-31'T'18:59:59Z")),
classOf[LocalDate] -> stringProperty(example = Some("2010-12-31")),
classOf[UuidId[_]] -> stringProperty(example = Some("370b0450-35cb-4aab-ba74-0145be75add5")),
classOf[StringId[_]] -> stringProperty(),
classOf[LongId[_]] -> stringProperty(),
classOf[CancerType] -> stringProperty()
)
val customCommonObjectsExamples = immutable.Map[Class[_], JsValue](
classOf[BridgeUploadQueue.Item] -> queueUploadItemFormat.write(common.nextBridgeUploadQueueItem()),
classOf[ProviderType] -> providerTypeFormat.write(common.nextProviderType()),
classOf[DocumentType] -> documentTypeFormat.write(common.nextDocumentType())
)
object trialcuration {
import xyz.driver.pdsuidomain.fakes.entities.trialcuration._
import xyz.driver.pdsuidomain.fakes.entities.export
import xyz.driver.pdsuidomain.formats.json.sprayformats.export._
import xyz.driver.pdsuidomain.formats.json.sprayformats.arm._
import xyz.driver.pdsuidomain.formats.json.sprayformats.slotarm._
import xyz.driver.pdsuidomain.formats.json.sprayformats.eligibilityarm._
import xyz.driver.pdsuidomain.formats.json.sprayformats.criterion._
import xyz.driver.pdsuidomain.formats.json.sprayformats.intervention._
import xyz.driver.pdsuidomain.formats.json.sprayformats.hypothesis._
import xyz.driver.pdsuidomain.formats.json.sprayformats.studydesign._
import xyz.driver.pdsuidomain.formats.json.sprayformats.trial._
import xyz.driver.pdsuidomain.formats.json.sprayformats.trialhistory._
import xyz.driver.pdsuidomain.formats.json.sprayformats.trialissue._
val customTrialCurationProperties = immutable.Map[Class[_], Property](
classOf[Trial.Status] -> stringProperty(),
classOf[TrialHistory.Action] -> stringProperty(),
classOf[TrialHistory.State] -> stringProperty()
) ++ customCommonProperties
val customTrialCurationObjectsExamples = immutable.Map[Class[_], JsValue](
classOf[Trial] -> trialWriter.write(nextTrial()),
classOf[Arm] -> armFormat.write(nextArm()),
classOf[TrialHistory] -> trialHistoryFormat.write(nextTrialHistory()),
classOf[TrialIssue] -> trialIssueWriter.write(nextTrialIssue()),
classOf[RichCriterion] -> richCriterionFormat.write(nextRichCriterion()),
classOf[InterventionWithArms] -> interventionFormat.write(nextInterventionWithArms()),
classOf[InterventionType] -> interventionTypeFormat.write(nextInterventionType()),
classOf[Hypothesis] -> hypothesisFormat.write(nextHypothesis()),
classOf[StudyDesign] -> studyDesignFormat.write(nextStudyDesign()),
classOf[ExportTrialWithLabels] -> trialWithLabelsFormat.write(export.nextExportTrialWithLabels()),
classOf[EligibilityArmWithDiseases] -> eligibilityArmWithDiseasesWriter.write(nextEligibilityArmWithDiseases()),
classOf[SlotArm] -> slotArmFormat.write(nextSlotArm())
)
}
object recordprocessing {
import xyz.driver.pdsuidomain.fakes.entities.recordprocessing._
import xyz.driver.pdsuidomain.fakes.entities.export
import xyz.driver.pdsuidomain.formats.json.sprayformats.export._
import xyz.driver.pdsuidomain.formats.json.sprayformats.documentissue._
import xyz.driver.pdsuidomain.formats.json.sprayformats.documenthistory._
import xyz.driver.pdsuidomain.formats.json.sprayformats.recordissue._
import xyz.driver.pdsuidomain.formats.json.sprayformats.recordhistory._
import xyz.driver.pdsuidomain.formats.json.sprayformats.extracteddata._
val customRecordProcessingProperties = immutable.Map[Class[_], Property](
classOf[MedicalRecord.Status] -> stringProperty(),
classOf[MedicalRecordHistory.Action] -> stringProperty(),
classOf[MedicalRecordHistory.State] -> stringProperty(),
classOf[Document.Status] -> stringProperty(),
classOf[Document.RequiredType] -> stringProperty(),
classOf[DocumentHistory.Action] -> stringProperty(),
classOf[DocumentHistory.State] -> stringProperty()
) ++ customCommonProperties
val customRecordProcessingObjectsExamples = immutable.Map[Class[_], JsValue](
classOf[Document] -> documentFormat.write(nextDocument()),
classOf[DocumentIssue] -> documentIssueFormat.write(nextDocumentIssue()),
classOf[DocumentHistory] -> documentHistoryFormat.write(nextDocumentHistory()),
classOf[MedicalRecord] -> recordFormat.write(nextMedicalRecord()),
classOf[MedicalRecordIssue] -> recordIssueFormat.write(nextMedicalRecordIssue()),
classOf[MedicalRecordHistory] -> recordHistoryFormat.write(nextMedicalRecordHistory()),
classOf[RichExtractedData] -> extractedDataFormat.write(nextRichExtractedData()),
classOf[ExportPatientWithLabels] -> patientWithLabelsFormat.write(export.nextExportPatientWithLabels())
) ++ customCommonObjectsExamples
}
object treatmentmatching {
import xyz.driver.pdsuidomain.fakes.entities.treatmentmatching._
import xyz.driver.pdsuidomain.formats.json.sprayformats.patient._
import xyz.driver.pdsuidomain.formats.json.sprayformats.patientcriterion._
import xyz.driver.pdsuidomain.formats.json.sprayformats.patientdefiningcriteria._
import xyz.driver.pdsuidomain.formats.json.sprayformats.patienteligibletrial._
import xyz.driver.pdsuidomain.formats.json.sprayformats.patientlabel._
import xyz.driver.pdsuidomain.formats.json.sprayformats.patienthypothesis._
import xyz.driver.pdsuidomain.formats.json.sprayformats.patienthistory._
import xyz.driver.pdsuidomain.formats.json.sprayformats.patientissue._
val customTreatmentMatchingProperties = immutable.Map[Class[_], Property](
classOf[Patient.Status] -> stringProperty(),
classOf[PatientHistory.Action] -> stringProperty(),
classOf[PatientHistory.State] -> stringProperty()
) ++ customCommonProperties
val customTreatmentMatchingObjectsExamples = immutable.Map[Class[_], JsValue](
classOf[Patient] -> patientWriter.write(nextPatient()),
classOf[RichPatientLabel] -> richPatientLabelWriter.write(nextRichPatientLabel()),
classOf[PatientLabel] -> patientLabelDefiningCriteriaWriter.write(nextPatientLabel()),
classOf[RichPatientCriterion] -> patientCriterionWriter.write(nextRichPatientCriterion()),
classOf[DraftPatientCriterion] -> draftPatientCriterionFormat.write(nextDraftPatientCriterion()),
classOf[PatientLabelEvidenceView] -> patientLabelEvidenceWriter.write(nextPatientLabelEvidenceView()),
classOf[RichPatientEligibleTrial] -> patientEligibleTrialWriter.write(nextRichPatientEligibleTrial()),
classOf[PatientHypothesis] -> patientHypothesisWriter.write(nextPatientHypothesis()),
classOf[RichPatientHypothesis] -> richPatientHypothesisWriter.write(nextRichPatientHypothesis()),
classOf[PatientHistory] -> patientHistoryFormat.write(nextPatientHistory()),
classOf[PatientIssue] -> patientIssueWriter.write(nextPatientIssue()),
classOf[ListResponse[Patient]] -> listResponseWriter[Patient].write(nextPatientListResponse()),
classOf[ListResponse[PatientLabel]] -> listResponseWriter[PatientLabel].write(nextPatientLabelListResponse()),
classOf[ListResponse[RichPatientLabel]] -> listResponseWriter[RichPatientLabel].write(
nextRichPatientLabelListResponse()),
classOf[ListResponse[RichPatientCriterion]] -> listResponseWriter[RichPatientCriterion].write(
nextRichPatientCriterionListResponse()),
classOf[ListResponse[PatientLabelEvidenceView]] -> listResponseWriter[PatientLabelEvidenceView].write(
nextPatientLabelEvidenceViewListResponse()),
classOf[ListResponse[RichPatientEligibleTrial]] -> listResponseWriter[RichPatientEligibleTrial].write(
nextRichPatientEligibleTrialListResponse()),
classOf[ListResponse[RichPatientHypothesis]] -> listResponseWriter[RichPatientHypothesis].write(
nextRichPatientHypothesisListResponse()),
classOf[ListResponse[PatientIssue]] -> listResponseWriter[PatientIssue].write(nextPatientIssuesListResponse()),
classOf[ListResponse[PatientHistory]] -> listResponseWriter[PatientHistory].write(
nextPatientHistoryListResponse())
) ++ customCommonObjectsExamples
}
}