aboutsummaryrefslogblamecommitdiff
path: root/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/rep/MedicalRecordGen.scala
blob: 0ea3cdd5853c9c0f33dc501a91f0014bdecaabe7 (plain) (tree)

















































































































































                                                                                                             
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()
    )
  }

}