///|
pub(all) enum StructureLevelKind {
  SupportLevel
  ResistanceLevel
  MidlineLevel
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct StructureLevel {
  kind : StructureLevelKind
  price : Double
  touches : Int
  latest_seq : Int
  label : String
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct StructureLevelFrame {
  source_id : SourceId
  support_levels : Array[StructureLevel]
  resistance_levels : Array[StructureLevel]
  midline : StructureLevel?
  summary : String
} derive(Debug, Eq, ToJson, FromJson)

///|
pub fn structure_level(
  kind : StructureLevelKind,
  price : Double,
  touches : Int,
  latest_seq : Int,
  label : String,
) -> StructureLevel {
  { kind, price, touches, latest_seq, label }
}

///|
pub fn structure_level_frame(
  source_id : SourceId,
  support_levels : Array[StructureLevel],
  resistance_levels : Array[StructureLevel],
  midline? : StructureLevel,
  summary? : String = "",
) -> StructureLevelFrame {
  { source_id, support_levels, resistance_levels, midline, summary }
}