@startuml
'Class Diagram:


' === Customer and Payment Classes ===
class Customer {
    +customerId: int
    +name: String
    +status: String  ' normal, suspended
    +turnover(month: Date): double
}

class RefuelCard {
    +cardId: int
    +issueDate: Date
    +isBlocked: Boolean
    +holder: Customer
}

class Invoice {
    +invoiceId: int
    +month: Date
    +amount: double
    +discount: double
    +isPaid: Boolean
    +sendInvoice()
	+MEcrInvoiceLine()
	+MEendInvoiceLine()
}

class InvoiceLine {
	+amount: double
	+MEcrInvoiceLine()
	+MEendInvoiceLine()
}

class CashTurn {
  +MEcrCashTurn()
  +scanCreditCard()
  +MEendCashTurn()
  +cancelCashTurn()
  +driveAwayWithoutPaying()
  +payCash()
  +putBackNozzle()
  +takeNozzleCredit()
  +chargeCreditCard()
  +putBackNozzleCash()
  +MEtakeNozzleCash()
}

class RefuelTurn {
    +turnId: int
    +date: Date
    +amount: double
    +startRefuel()
    +stopRefuel()
}


'=== Gas Station and Pump Classes ===
class GasStation {
    +stationId: int
    +location: String
    +generateDailyReport()
}

class Pump {
    +pumpId: int
    +gasType: String
    +isAvailable: Boolean
    +isBlocked: Boolean
    +startRefuel()
    +stopRefuel()
    +blockPump()
    +releasePump()
}

class Reservoir {
    +reservoirId: int
    +capacity: double
    +currentLevel: double
    +reorderLevel: double
    +criticalLevel: double
    +refill(quantity: double)
}


' === Relationships ===
Customer "1" -- "0..*" RefuelCard : owns >
Customer "1" -- "0..*" Invoice : receives >
Invoice "1" -- "1..*" InvoiceLine : aggregates >
RefuelTurn "1" -- "0..1" InvoiceLine : invoicedOn >
GasStation "1" -- "0..*" Pump : has >
Pump "1" -- "1" Reservoir : contains >
RefuelTurn "0..*" -- "1" Pump : uses >
CashTurn "0..*" -- "1" Pump : uses >
RefuelTurn "0..*" -- "0..1" RefuelCard : paid by >

@enduml

============ STATECHARTS ==================

===CUSTOMER==========
@startuml
title CustomerLC (Customer)

state normal
ended --> [*]
state suspended

[*] --> normal :  MEcrCustomer
normal --> ended : MEendCustomer
normal --> normal : MEcrInvoice, MEcrInvoiceLine, MEcrRCRefuelTurn, MEendInvoice, MEendInvoiceLine, MEendRCRefuelTurn, MEcancelRCRefuelTurn, pay, send, MEputBackNozzleRC, MEtakeNozzleRC
normal --> suspended : MEsuspend
suspended --> normal : MEunsuspend
suspended --> ended : MEendCustomer
suspended --> suspended : send, pay
@enduml

=== INVOICE =============
@startuml
title InvoiceLC (Invoice)

[*] --> initial
ended --> [*]
state exists
state sent
state paid

initial --> exists : initialExists / MEcrInvoice
exists --> exists : existsExists / MEcrInvoiceLine, MEendInvoiceLine
exists --> ended : existsEnded / MEendInvoice
exists --> sent : existsSent / send
sent --> sent : sentSent / MEendInvoiceLine, send
sent --> ended : sentEnded / defaultOnInvoice
sent --> paid : sentPaid / pay
paid --> paid : paidPaid / MEendInvoiceLine
paid --> ended : paidEnded / MEendInvoice
@enduml


=== Refuel Card REFUEL TURN ===============
@startuml


[*] --> cardIdentified : MEScanRefuelCard

cardIdentified --> RCfilling: MEtakeNozzleRC

RCfilling --> RCfillingEnded: MEputBackNozzleRC

RCfillingEnded --> invoiced : MEcrInvoiceLine
invoiced --> invoiced: MEendInvoiceLine

invoiced --> [*]: MEendRefuelTurn
cardIdentified --> [*]: MEcancelRefuelTurn


@enduml


=== ANONYMOUS REFUEL TURN ===============
@startuml


[*] --> creditCardIdentified : MEScanCreditCard
[*] --> cashTurnIdentified : MEstartCashTurn

cashTurnIdentified --> fillingCash: MEtakeNozzleAnon
creditCardIdentified --> fillingCreditCard: MEtakeNozzleAnon

fillingCash--> fillingCashEnded: MEputBackNozzle
fillingCreditCard --> fillingCreditCardEnded: MEputBackNozzle

fillingCashEnded --> paid : MEpayCash
fillingCashEnded --> unpaid : MEdriveAwayWithoutPaying

fillingCreditCardEnded --> paid : MEchargeCreditCard

paid --> [*]: MEendRefuelTurn
unpaid --> [*]: MEendRefuelTurn
cashTurnIdentified --> [*]: MEcancelRefuelTurn
creditCardIdentified --> [*]: MEcancelRefuelTurn


@enduml

=== Pump ===

@startuml
title PumpLC (Pump)

[*] --> initial
state exists
ended --> [*]
state reserved
state inUse
state blocked

initial --> exists : initialExists / MEcrPump
exists --> ended : existsEnded / MEendPump
exists --> reserved : existsReserved / MEcrRefuelTurn, MEscanCreditCard, MEstartCashTurn
reserved --> exists : reservedExists / MEcancelRefuelTurn, cancelCashTurn
reserved --> inUse : reservedInUse / MEtakeNozzleRC, MEtakeNozzleCredit, MEtakeNozzleCash
inUse --> exists : inUseExists / MEputBackNozzleRC, MEputBackNozzle
exists --> blocked : existsBlocked / block
blocked --> blocked : blockedBlocked / Settling
blocked --> exists : blockedExists / release
blocked --> ended : blockedEnded / MEendPump
@enduml

=== Reservoir ===
@startuml
title Reservoir State Diagram

[*] --> Normal

state Normal
state NeedsRefill
state CriticalBlocked
state Refilling
state Settling

' --- State actions ---
Refilling : entry / blockPump()
Refilling : do / refillReservoir()

Settling : entry / startSettlingTimer(~1h)

' --- Level-based transitions while operating ---
Normal --> NeedsRefill : fuelLevel <= reorderLevel
NeedsRefill --> CriticalBlocked : fuelLevel <= criticalLevel

' --- Refilling can start from any main state ---
Normal --> Refilling : startRefill()
NeedsRefill --> Refilling : startRefill()
CriticalBlocked --> Refilling : startRefill()

' --- After refill, let dirt settle, pump stays blocked ---
Refilling --> Settling : refillCompleted()

' --- Pump is released when safe ---
Settling --> Normal : pumpReleasedByStaff()

@enduml