///|
// Represents a PERSON entity.
// Example:
//   PERSON('id', 'last', 'first', ('middle'), ('prefix'), ('suffix'))
pub struct Person {
  id : String
  last_name : String
  first_name : String
  middle_names : Array[String]
  prefix_titles : Array[String]
  suffix_titles : Array[String]
}

///|
pub fn Person::new(
  id : String,
  last_name : String,
  first_name : String,
  middle_names : Array[String],
  prefix_titles : Array[String],
  suffix_titles : Array[String],
) -> Person {
  Person::{
    id,
    last_name,
    first_name,
    middle_names,
    prefix_titles,
    suffix_titles,
  }
}

///|
pub impl @step.Entity for Person with fn to_step(self) {
  let middles = "(" + self.middle_names.map(@step.step_str).join(",") + ")"
  let prefixes = "(" + self.prefix_titles.map(@step.step_str).join(",") + ")"
  let suffixes = "(" + self.suffix_titles.map(@step.step_str).join(",") + ")"
  "PERSON(\{@step.step_str(self.id)},\{@step.step_str(self.last_name)},\{@step.step_str(self.first_name)},\{middles},\{prefixes},\{suffixes})"
}