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.{nextLocalDateTime, nextLongId, nextStringId, nextUuidId} object MedicalRecordGen { private val maxItemsInCollectionNumber = 50 private val pageMaxNumber = 1000 private val medicalRecordMetas = { Set( () => nextMedicalRecordMetaReorder, () => nextMedicalRecordMetaDuplicate, () => nextMedicalRecordMetaRotation ) } def nextMedicalRecordMetas(count: Int): List[MedicalRecord.Meta] = List.fill(count)(nextMedicalRecordMeta) private 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) private 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 = generators.oneOf[MedicalRecord.Status](MedicalRecord.Status.All) 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 = nextOption(nextMedicalRecordStatus), 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 = Common.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() ) } }