package xyz.driver.pdsuidomain.entities import java.time.{LocalDateTime, ZoneId} import xyz.driver.core.auth.User import xyz.driver.pdsuicommon.domain._ import xyz.driver.pdsuicommon.logging._ import xyz.driver.pdsuicommon.utils.Utils final case class UserHistory(id: LongId[UserHistory], executor: xyz.driver.core.Id[User], recordId: Option[LongId[MedicalRecord]] = None, documentId: Option[LongId[Document]] = None, trialId: Option[StringId[Trial]] = None, patientId: Option[UuidId[Patient]] = None, state: UserHistory.State, action: UserHistory.Action, created: LocalDateTime = LocalDateTime.now(ZoneId.of("Z"))) object UserHistory { def forDocument(executor: xyz.driver.core.Id[User], documentId: LongId[Document], state: UserHistory.State, action: UserHistory.Action): UserHistory = UserHistory( id = LongId(0L), executor = executor, documentId = Some(documentId), state = state, action = action ) def forRecord(executor: xyz.driver.core.Id[User], recordId: LongId[MedicalRecord], state: UserHistory.State, action: UserHistory.Action): UserHistory = UserHistory( id = LongId(0L), executor = executor, recordId = Some(recordId), state = state, action = action ) def forPatient(executor: xyz.driver.core.Id[User], patientId: UuidId[Patient], state: UserHistory.State, action: UserHistory.Action): UserHistory = UserHistory( id = LongId(0L), executor = executor, patientId = Some(patientId), state = state, action = action ) sealed trait State extends Product with Serializable { def oneOf(xs: State*): Boolean = xs.contains(this) def oneOf(xs: Set[State]): Boolean = xs.contains(this) } object State { case object Clean extends State case object Organize extends State case object Extract extends State case object Summarize extends State case object Criteriarize extends State case object Verify extends State case object Curate extends State case object Review extends State case object Flag extends State val All: Set[State] = Set[State](Clean, Organize, Extract, Summarize, Criteriarize, Verify, Curate, Review, Flag) val fromString: PartialFunction[String, State] = { case "Clean" => State.Clean case "Organize" => State.Organize case "Extract" => State.Extract case "Summarize" => State.Summarize case "Criteriarize" => State.Criteriarize case "Verify" => State.Verify case "Curate" => State.Curate case "Review" => State.Review case "Flag" => State.Flag } def stateToString(x: State): String = x match { case State.Clean => "Clean" case State.Organize => "Organize" case State.Extract => "Extract" case State.Summarize => "Summarize" case State.Criteriarize => "Criteriarize" case State.Verify => "Verify" case State.Curate => "Curate" case State.Review => "Review" case State.Flag => "Flag" } implicit def toPhiString(x: State): PhiString = Unsafe(Utils.getClassSimpleName(x.getClass)) } sealed trait Action extends Product with Serializable { def oneOf(xs: Action*): Boolean = xs.contains(this) def oneOf(xs: Set[Action]): Boolean = xs.contains(this) } object Action { case object Start extends Action case object Submit extends Action case object Unassign extends Action case object Resolve extends Action case object Flag extends Action case object Archive extends Action val All: Set[Action] = Set[Action](Start, Submit, Unassign, Resolve, Flag, Archive) val fromString: PartialFunction[String, Action] = { case "Start" => Action.Start case "Submit" => Action.Submit case "Unassign" => Action.Unassign case "Resolve" => Action.Resolve case "Flag" => Action.Flag case "Archive" => Action.Archive } def actionToString(x: Action): String = x match { case Action.Start => "Start" case Action.Submit => "Submit" case Action.Unassign => "Unassign" case Action.Resolve => "Resolve" case Action.Flag => "Flag" case Action.Archive => "Archive" } implicit def toPhiString(x: Action): PhiString = Unsafe(Utils.getClassSimpleName(x.getClass)) } implicit def toPhiString(x: UserHistory): PhiString = { import x._ phi"UserHistory(id=$id, executor=${Unsafe(executor)}, recordId=$recordId, " + phi"documentId=$documentId, trialId=$trialId, patientId=$patientId, " + phi"state=$state, action=$action, created=$created)" } }