@startuml
skinparam nodesep 45
' CONTROLS node horizontal separation
' skinparam ranksep 60 CONTROLS vertical separation

object Competition
object "Inscription phase" as Inscription {
  Date
  Place
  CompetitionType: Category
}
object CompetitionDraw
object Batch
object Weighing {
  Athlete identification
  AthleteBodyWeight
  SnatchOpener
  CleanJerkOpener
}
object ClassificationAct
object CategoryClassification
object SinclairClassification
object SinclairMaloneClassification
object EliteClassification
object EliteSpreadsheetMale
object EliteSpreadsheetFemale
object Platform {
  name
}
object Club
object Athlete {
  name
  birthYear
}
enum Gender {
  MALE
  FEMALE
}
object "Technical officers" as TC
object Judge
object Marshall
object CompetitionSecretary
object TimeJudge
object Lift
enum Type {
  SNATCH
  CLEAN_&_JERK
}
enum LiftStatus {
  PENDING
  VALID
  NULL
  REJECTED
}
enum Countdown {
  60_SECONDS
  120_SECONDS
}
object BarSet
object Bar
object FemaleBar {
  weight: 15kg
}
object MaleBar {
  weight: 20kg
}
object Plates
enum Plate {
  25-RED
  15-YELLOW
  10-GREEN
  5-WHITE
  2.5-RED
  1.5-YELLOW
  1-GREEN
  0.5-WHITE
}
object Collar {
  weight: 2.5kg
}

object Category {
  Gender
}

object Sub15 {

}

object Sub17 {
  age: 13-17
}

object Junior {
  age: 13-20
}

object Senior {
  age: 13_Plus
}

object Master {
  age: 35_Plus
}

'Sub15 "includes" --> Sub17
'Sub17 "includes" --> Junior
'Junior "includes" --> Senior
enum Sub15_M {
   age: 13-15
   --
   bodyweight_limits: bodyWeightSub15W

  45
  50
  56
  62
  69
  77
  85
  85_PLUS
}

object Sub15_W {
 age: 13-15
 --
 bodyweight_limits: bodyWeightSub15W
}

enum BodyWeightSub15W {
 44
 48
 53
 58
 63
 69
 75
 75_PLUS
}

enum BodyWeightSub15M {
  45
  50
  56
  62
  69
  77
  85
  85_PLUS
 }

Sub15_W --> BodyWeightSub15W
Sub15_M --> BodyWeightSub15M
enum Sub17_M {
  50
  56
  62
  69
  77
  85
  94
  94_PLUS
}

enum Sub17_W {
 44
 48
 53
 5863
 69
 75
 75_PLUS
}

enum Common_M {
56
62
69
77
85
94
105
105_PLUS
}

enum Common_W {
48
53
58
63
69
75
90
90_PLUS
}

object Iteration
object Announcement
object NextLifter
object FollowingLifter

Competition *-- Inscription
Inscription "1..*"  *-- Athlete
Athlete <-- Gender
Club "1..*" *-- Athlete
Competition *-- CompetitionDraw
Competition "1..*" *--  Batch
Competition *-- ClassificationAct
ClassificationAct <|-- CategoryClassification
ClassificationAct <|-- SinclairClassification
ClassificationAct <|-- SinclairMaloneClassification
ClassificationAct <|-- EliteClassification
EliteClassification *-- EliteSpreadsheetMale
EliteClassification *-- EliteSpreadsheetFemale


object "Sinclair Coeficcient" as sc {
  Note: relates bodyweight with lift weight
}

object "SinclairMalone Coeficcient" as scm {
  Note: relates bodyweight with lift weight and age
}

SinclairClassification *-- sc
SinclairMaloneClassification *-- scm

Batch "next" --> ClassificationAct
Inscription --> "next" CompetitionDraw
CompetitionDraw --> "next" Batch

Batch *-- Weighing
Batch o-- "1..2" Platform
Batch "1..*" *---  Athlete
Batch *--- TC

TC *-- "3..6" Judge
TC *-- CompetitionSecretary
TC *-- "0..1" Marshall
TC *-- "0..1" TimeJudge

Platform "1..*" *---  Iteration
Iteration "1..*" *--  Announcement
Announcement *-- NextLifter
Announcement *-- FollowingLifter
NextLifter "next" --> FollowingLifter
NextLifter ---> Lift
NextLifter <-- "preguntar a luis\n orden cardinales \nflechas" Athlete
FollowingLifter <-- Athlete

Lift *-- Type
Lift *-- LiftStatus
Lift *-- Countdown
Lift o-- BarSet
BarSet *-- Bar
BarSet *-- Plates
BarSet *-- "2" Collar
Bar <|-- FemaleBar
Bar <|-- MaleBar
Plates *-- Plate

Category *-- Sub15_W
Category *-- Sub15_M
Category *-- Sub17_W
Category *-- Sub17_M
Category *-- Common_M
Category *-- Common_W
Category *-- Common_M
Category *-- Common_W
Category *-- Common_M
Category *-- Common_W

Athlete *-- Category


@enduml
