package xyz.driver.pdsuidomain.fakes.entities.rep import xyz.driver.pdsuidomain.entities._ import xyz.driver.core.generators import xyz.driver.core.generators._ import xyz.driver.pdsuicommon.domain.{LongId, TextJson, User} import xyz.driver.pdsuidomain.fakes.entities.common._ object MedicalRecordGen { private val maxItemsInCollectionNumber: Int = 50 private val pageMaxNumber: Int = 1000 private val medicalRecordMetas: Set[() => MedicalRecord.Meta] = { Set( () => nextMedicalRecordMetaReorder(), () => nextMedicalRecordMetaDuplicate(), () => nextMedicalRecordMetaRotation() ) } def nextMedicalRecordMetas(count: Int): List[MedicalRecord.Meta] = List.fill(count)(nextMedicalRecordMeta()) def nextMedicalRecordMetasJson(): TextJson[List[MedicalRecord.Meta]] = TextJson(nextMedicalRecordMetas(nextInt(maxItemsInCollectionNumber, minValue = 0))) private def nextDocument(): Document = DocumentGen.nextDocument() private def nextDocuments(count: Int): List[Document] = List.fill(count)(nextDocument()) def nextDocuments(recordId: LongId[MedicalRecord]): TextJson[List[Document]] = { val documents = nextDocuments( nextInt(maxItemsInCollectionNumber, minValue = 0) ) TextJson(documents.map(_.copy(recordId = recordId))) } def nextMedicalRecordStatus(): MedicalRecord.Status = MedicalRecord.Status.New def nextMedicalRecordHistoryState(): MedicalRecordHistory.State = generators.oneOf[MedicalRecordHistory.State](MedicalRecordHistory.State.All) def nextMedicalRecordHistoryAction(): MedicalRecordHistory.Action = generators.oneOf[MedicalRecordHistory.Action](MedicalRecordHistory.Action.All) def nextMedicalRecordMetaReorder(): MedicalRecord.Meta.Reorder = { val itemsNumber = maxItemsInCollectionNumber val items = scala.util.Random .shuffle(Seq.tabulate(itemsNumber)(identity)) MedicalRecord.Meta.Reorder( predicted = nextOption(nextBoolean), items = items ) } def nextMedicalRecordMetaDuplicate(): MedicalRecord.Meta.Duplicate = { val startPageGen = nextInt(pageMaxNumber, minValue = 0) val endPageGen = nextInt(pageMaxNumber, startPageGen) MedicalRecord.Meta.Duplicate( predicted = nextOption(nextBoolean), startPage = startPageGen.toDouble, endPage = endPageGen.toDouble, startOriginalPage = startPageGen.toDouble, endOriginalPage = nextOption(endPageGen.toDouble) ) } def nextMedicalRecordMetaRotation(): MedicalRecord.Meta.Rotation = { val items = Array .tabulate(maxItemsInCollectionNumber)( index => nextString() -> index ) .toMap MedicalRecord.Meta.Rotation( predicted = nextOption(nextBoolean()), items = items ) } def nextMedicalRecordMeta(): MedicalRecord.Meta = { generators.oneOf(medicalRecordMetas)() } def nextMedicalRecord(): MedicalRecord = { val id = nextLongId[MedicalRecord] MedicalRecord( id = nextLongId[MedicalRecord], status = nextMedicalRecordStatus(), previousStatus = None, assignee = nextOption(nextStringId), previousAssignee = nextOption(nextStringId), lastActiveUserId = nextOption(nextStringId), patientId = nextUuidId, requestId = RecordRequestId(generators.nextUuid()), disease = generators.nextString(), caseId = nextOption(CaseId(generators.nextString())), physician = nextOption(generators.nextString()), meta = nextOption(nextMedicalRecordMetasJson()), predictedMeta = nextOption(nextMedicalRecordMetasJson()), predictedDocuments = nextOption(nextDocuments(id)), lastUpdate = nextLocalDateTime ) } def nextMedicalRecordHistory(): MedicalRecordHistory = { MedicalRecordHistory( id = nextLongId[MedicalRecordHistory], executor = nextStringId[User], recordId = nextLongId[MedicalRecord], state = nextMedicalRecordHistoryState(), action = nextMedicalRecordHistoryAction(), created = nextLocalDateTime ) } def nextMedicalRecordIssue(): MedicalRecordIssue = { val pages = nextStartAndEndPages MedicalRecordIssue( id = nextLongId[MedicalRecordIssue], userId = nextStringId[User], recordId = nextLongId[MedicalRecord], startPage = pages._1, endPage = pages._2, lastUpdate = nextLocalDateTime, isDraft = nextBoolean(), text = nextString(), archiveRequired = nextBoolean() ) } def nextProviderType(): ProviderType = generators.oneOf(ProviderType.All: _*) }