1+ from abc import ABC , abstractmethod
2+ from enums import *
3+ import datetime
4+
5+ class ParkingTicket (ABC ):
6+ def __init__ (self ,token ):
7+ self .token = token
8+ self .ammount = 0
9+ self .issued_at = datetime .datetime .now ()
10+ self .payed = False
11+ self .payedAt = None
12+
13+
14+ class ParkingLot (ABC ):
15+
16+ def __init__ (self ,name ,location ):
17+ self .name = name
18+ self .location = location
19+
20+
21+ def addVehicleToSpot (self , spot , vehicle ):
22+ parkingTicket = None
23+ token = spot .assign_vehicle (vehicle )
24+ if token != "OutOfCapcity" :
25+ parkingTicket = ParkingTicket (token )
26+ return parkingTicket
27+
28+ def removeVehicleFromSpot (self , spot , ticket ):
29+ spot .remove_vehicle (ticket .token )
30+ now = datetime .datetime .now ()
31+ duration = now - ticket .issued_at
32+ duration_in_s = duration .total_seconds ()
33+ hours = duration_in_s / 3600
34+ # hours = divmod(duration_in_s, 3600)[0]
35+ return spot .pricingModel .calculate_price (hours )
36+
37+
38+
39+
40+ @abstractmethod
41+ def park_vehicle (self , vehicle ):
42+ pass
43+
44+ @abstractmethod
45+ def unpark_vehicle (self , vehicle ):
46+ pass
47+
48+ @abstractmethod
49+ def add_moter_bike_parking_spot (self , spot ):
50+ pass
51+
52+ @abstractmethod
53+ def add_car_parking_spot (self , spot ):
54+ pass
55+
56+ @abstractmethod
57+ def add_truck_parking_spot (self , spot ):
58+ pass
59+
60+
61+ class MallParkingLot (ParkingLot ):
62+ def __init__ (self ,name ,location ):
63+ super ().__init__ (name , location )
64+
65+ def add_moter_bike_parking_spot (self , spot ):
66+ self .moter_bike_spots = spot
67+
68+ def add_car_parking_spot (self , spot ):
69+ self .car_spots = spot
70+
71+ def add_truck_parking_spot (self , spot ):
72+ self .truck_sports = spot
73+
74+ def park_vehicle (self , vehicle ):
75+ switcher = {
76+ VehicleType .MOTORBIKE : self .addVehicleToSpot (self .moter_bike_spots , vehicle ),
77+ VehicleType .CAR : self .addVehicleToSpot (self .car_spots , vehicle ),
78+ VehicleType .TRUCK : self .addVehicleToSpot (self .truck_sports , vehicle ),
79+ }
80+ ticket = switcher .get (vehicle .vehical_type , lambda : 'Wrong vehicle type!' )
81+ if ticket is None :
82+ return "No Space Available"
83+ return ticket
84+
85+ def unpark_vehicle (self , vehicle , ticket ):
86+ switcher = {
87+ VehicleType .MOTORBIKE : self .removeVehicleFromSpot (self .moter_bike_spots , ticket ),
88+ VehicleType .CAR : self .removeVehicleFromSpot (self .car_spots , ticket ),
89+ VehicleType .TRUCK : self .removeVehicleFromSpot (self .truck_sports , ticket ),
90+ }
91+ price = switcher .get (vehicle .vehical_type , lambda : 'Wrong vehicle type!' )
92+ return price
93+
94+ class StadiumParkingLot (ParkingLot ):
95+ def __init__ (self ,name ,location ):
96+ super ().__init__ (name , location )
97+
98+ def add_moter_bike_parking_spot (self , spot ):
99+ self .moter_bike_spots = spot
100+
101+ def add_car_parking_spot (self , spot ):
102+ self .car_spots = spot
103+
104+ def add_truck_parking_spot (self , spot ):
105+ return "not supported"
106+
107+ def park_vehicle (self , vehicle ):
108+ switcher = {
109+ VehicleType .MOTORBIKE : self .addVehicleToSpot (self .moter_bike_spots , vehicle ),
110+ VehicleType .CAR : self .addVehicleToSpot (self .car_spots , vehicle ),
111+ VehicleType .TRUCK : "Not Supported" ,
112+ }
113+ ticket = switcher .get (vehicle .vehical_type , lambda : 'Wrong vehicle type!' )
114+ if ticket is None :
115+ return "No Space Available"
116+ return ticket
117+
118+ def unpark_vehicle (self , vehicle , ticket ):
119+ switcher = {
120+ VehicleType .MOTORBIKE : self .removeVehicleFromSpot (self .moter_bike_spots , ticket ),
121+ VehicleType .CAR : self .removeVehicleFromSpot (self .car_spots , ticket ),
122+ VehicleType .TRUCK : "Not Supported" ,
123+ }
124+ price = switcher .get (vehicle .vehical_type , lambda : 'Wrong vehicle type!' )
125+ return price
126+
127+ class AirportParkingLot (ParkingLot ):
128+ def __init__ (self ,name ,location ):
129+ super ().__init__ (name , location )
130+
131+ def add_moter_bike_parking_spot (self , spot ):
132+ self .moter_bike_spots = spot
133+
134+ def add_car_parking_spot (self , spot ):
135+ self .car_spots = spot
136+
137+ def add_truck_parking_spot (self , spot ):
138+ return "not supported"
139+
140+ def park_vehicle (self , vehicle ):
141+ switcher = {
142+ VehicleType .MOTORBIKE : self .addVehicleToSpot (self .moter_bike_spots , vehicle ),
143+ VehicleType .CAR : self .addVehicleToSpot (self .car_spots , vehicle ),
144+ VehicleType .TRUCK : "Not Supported" ,
145+ }
146+ ticket = switcher .get (vehicle .vehical_type , lambda : 'Wrong vehicle type!' )
147+ if ticket is None :
148+ return "No Space Available"
149+ return ticket
150+
151+ def unpark_vehicle (self , vehicle , ticket ):
152+ switcher = {
153+ VehicleType .MOTORBIKE : self .removeVehicleFromSpot (self .moter_bike_spots , ticket ),
154+ VehicleType .CAR : self .removeVehicleFromSpot (self .car_spots , ticket ),
155+ VehicleType .TRUCK : "Not Supported" ,
156+ }
157+ price = switcher .get (vehicle .vehical_type , lambda : 'Wrong vehicle type!' )
158+ return price
0 commit comments