11package com .example ;
22
3- import com .example .api .ElpriserAPI ;
3+ import java .time .LocalDate ;
4+ import java .time .format .DateTimeFormatter ;
5+ import java .time .format .DateTimeParseException ;
6+ import java .util .ArrayList ;
7+ import java .util .Comparator ;
8+ import java .util .List ;
49
510public class Main {
611 public static void main (String [] args ) {
12+ // hjälp
13+ if (args .length > 0 && args [0 ].equals ("--help" )) {
14+ skrivUtHjalp ();
15+ return ;
16+ }
17+
18+ String zone = "SE3" ;
19+ LocalDate date = LocalDate .now ();
20+ LocalDate startDate = date .plusDays (1 );
21+ boolean sorted = false ;
22+ int chargingHours = 0 ;
23+
24+ for (int i = 0 ; i < args .length ; i ++) {
25+ switch (args [i ]) {
26+ case "--date" :
27+ if (i + 1 < args .length ) {
28+ String dateArg = args [i + 1 ].toLowerCase ();
29+ if (dateArg .equals ("imorgon" )) {
30+ startDate = LocalDate .now ();
31+ } else if (dateArg .equals ("idag" )) {
32+ startDate = LocalDate .now ();
33+ } else {
34+ try {
35+ startDate = LocalDate .parse (dateArg );
36+ } catch (DateTimeParseException e ) {
37+ System .out .println ("Fel: Ogiltigt datumformat. Använd YYYY-MM-DD." );
38+ return ;
39+ }
40+ }
41+ i ++;
42+ }
43+ break ;
44+ case "--sorted" :
45+ sorted = true ;
46+ break ;
47+ case "--charging" :
48+ if (i + 1 < args .length ) {
49+ String val = args [i + 1 ].replace ("h" , "" );
50+ try {
51+ chargingHours = Integer .parseInt (val );
52+ } catch (NumberFormatException e ) {
53+ System .out .println ("error: use 2h, 4h or 8h." );
54+ return ;
55+ }
56+ i ++;
57+ }
58+ break ;
59+ }
60+ }
61+
62+ // API o prisklass
763 ElpriserAPI elpriserAPI = new ElpriserAPI ();
64+ ElpriserAPI .Prisklass prisklass ;
65+ try {
66+ prisklass = ElpriserAPI .Prisklass .valueOf (zone );
67+ } catch (IllegalArgumentException e ) {
68+ System .out .println ("Felaktig zon: " + zone );
69+ prisklass = ElpriserAPI .Prisklass .SE3 ;
70+ }
71+
72+ // priser
73+ List <ElpriserAPI .Elpris > priser = new ArrayList <>(elpriserAPI .getPriser (date , prisklass ));
74+ if (priser .isEmpty ()) {
75+ System .out .println ("inga priser tillgangliga for " + date + " in zon " + zone + "." );
76+ return ;
77+ }
78+
79+ List <ElpriserAPI .Elpris > imorgonPriser = elpriserAPI .getPriser (startDate , prisklass );
80+ if (imorgonPriser != null && !imorgonPriser .isEmpty ()) {
81+ priser .addAll (imorgonPriser );
82+ }
83+
84+ if (sorted ) {
85+ priser .sort (Comparator .comparingDouble (ElpriserAPI .Elpris ::sekPerKWh ).reversed ());
86+ }
87+
88+ // stats
89+ DateTimeFormatter tidFormat = DateTimeFormatter .ofPattern ("HH:mm" );
90+ ElpriserAPI .Elpris billigast = priser .getFirst ();
91+ ElpriserAPI .Elpris dyrast = priser .getFirst ();
92+ double summa = 0 ;
93+
94+ // skriv ut timpriser
95+ for (ElpriserAPI .Elpris pris : priser ) {
96+ System .out .printf ("%s: %.4f SEK/kWh%n" ,
97+ pris .timeStart ().format (tidFormat ), pris .sekPerKWh ());
98+ }
99+
100+ for (ElpriserAPI .Elpris pris : priser ) {
101+ summa += pris .sekPerKWh ();
102+ if (pris .sekPerKWh () < billigast .sekPerKWh ()) billigast = pris ;
103+ if (pris .sekPerKWh () > dyrast .sekPerKWh ()) dyrast = pris ;
104+ }
105+
106+ double medelpris = summa / priser .size ();
107+
108+ System .out .println ("Statistik" );
109+ System .out .println ("Datum: " + date );
110+ System .out .println ("Zon: " + zone );
111+ System .out .printf ("Medelpris: %.4f SEK/kWh%n" , medelpris );
112+ System .out .printf ("Billigast pris: %s - %.4f SEK/kWh%n" ,
113+ billigast .timeStart ().format (tidFormat ), billigast .sekPerKWh ());
114+ System .out .printf ("Dyrast pris: %s - %.4f SEK/kWh%n" ,
115+ dyrast .timeStart ().format (tidFormat ), dyrast .sekPerKWh ());
116+
117+ // opt laddning
118+ if (chargingHours > 0 ) {
119+ beraknaLaddningsfonster (priser , chargingHours , tidFormat );
120+ } else {
121+ // 2h, 4h, 8h
122+ for (int period : new int []{2 , 4 , 8 }) {
123+ beraknaLaddningsfonster (priser , period , tidFormat );
124+ }
125+ }
126+ }
127+
128+ // metod för laddningsfönster ??????????
129+ public static void beraknaLaddningsfonster (List <ElpriserAPI .Elpris > priser , int timmar , DateTimeFormatter format ) {
130+ if (priser .size () < timmar ) return ;
131+
132+ double minSum = Double .MAX_VALUE ;
133+ int minIndex = 0 ;
134+
135+ for (int i = 0 ; i <= priser .size () - timmar ; i ++) {
136+ double windowSum = 0 ;
137+ for (int j = i ; j < i + timmar ; j ++) {
138+ windowSum += priser .get (j ).sekPerKWh ();
139+ }
140+ if (windowSum < minSum ) {
141+ minSum = windowSum ;
142+ minIndex = i ;
143+ }
144+ }
145+
146+ String startTid = priser .get (minIndex ).timeStart ().format (format );
147+ String slutTid = priser .get (minIndex + timmar - 1 ).timeStart ().plusHours (1 ).format (format );
148+
149+ System .out .printf ("Billigast pris %dh-period: %s - %s (%.4f SEK totalt)%n" ,
150+ timmar , startTid , slutTid , minSum );
151+ }
152+
153+ // hjälptext
154+ public static void skrivUtHjalp () {
155+ System .out .println ("Usage: java -cp target/classes com.example.Main --zone <zon> [options]" );
156+ System .out .println ("--zone SE1|SE2|SE3|SE4" );
157+ System .out .println ("--date YYYY-MM-DD|imorgon" );
158+ System .out .println ("--sorted" );
159+ System .out .println ("--charging 2h|4h|8h" );
160+ System .out .println ("--help" );
8161 }
9- }
162+ }
0 commit comments