11package nambang_swag .bada_on .service ;
22
3+ import static nambang_swag .bada_on .constant .Activity .*;
4+
35import java .time .LocalDateTime ;
46import java .time .format .DateTimeFormatter ;
57import java .time .temporal .ChronoUnit ;
68import java .util .ArrayList ;
79import java .util .Comparator ;
10+ import java .util .HashMap ;
811import java .util .List ;
912import java .util .Map ;
1013import java .util .stream .Collectors ;
1518import lombok .RequiredArgsConstructor ;
1619import lombok .extern .slf4j .Slf4j ;
1720import nambang_swag .bada_on .constant .Activity ;
18- import nambang_swag .bada_on .constant .Message ;
1921import nambang_swag .bada_on .constant .PrecipitationType ;
2022import nambang_swag .bada_on .constant .SkyCondition ;
2123import nambang_swag .bada_on .constant .TideObservatory ;
2224import nambang_swag .bada_on .entity .Place ;
2325import nambang_swag .bada_on .entity .TideRecord ;
2426import nambang_swag .bada_on .entity .Weather ;
2527import nambang_swag .bada_on .exception .PlaceNotFound ;
28+ import nambang_swag .bada_on .exception .WeatherNotFound ;
2629import nambang_swag .bada_on .repository .PlaceRepository ;
2730import nambang_swag .bada_on .repository .TideRepository ;
2831import nambang_swag .bada_on .repository .WeatherRepository ;
@@ -40,39 +43,22 @@ public class WeatherService {
4043 private final TideRepository tideRepository ;
4144 private final PlaceRepository placeRepository ;
4245
43- public List < WeatherSummary > getWeatherSummary (Long id , String stringActivity ) {
46+ public WeatherSummary getWeatherSummary (Long id , int date , int hour ) {
4447 Place place = placeRepository .findById (id ).orElseThrow (PlaceNotFound ::new );
45- Activity activity = Activity .from (stringActivity );
46- LocalDateTime now = LocalDateTime .now ();
47- int today = Integer .parseInt (now .format (DateTimeFormatter .ofPattern ("yyyyMMdd" )));
48- int yesterday = Integer .parseInt (now .minusDays (1 ).format (DateTimeFormatter .ofPattern ("yyyyMMdd" )));
49- int tomorrow = Integer .parseInt (now .plusDays (1 ).format (DateTimeFormatter .ofPattern ("yyyyMMdd" )));
48+ Weather weather = weatherRepository .findByDateAndTimeAndPlace (date , hour * 100 , place )
49+ .orElseThrow (WeatherNotFound ::new );
5050
51+ List <Integer > relevantDates = calculateRelevantDates ();
5152 TideObservatory tideObservatory = TideObservatory .findNearest (place .getLatitude (), place .getLongitude ());
52- List <TideRecord > todayTide = tideRepository .findAllByDateAndTideObservatory (today , tideObservatory );
53- List <TideRecord > yesterdayTide = tideRepository .findAllByDateAndTideObservatory (yesterday , tideObservatory );
54- List <TideRecord > tomorrowTide = tideRepository .findAllByDateAndTideObservatory (tomorrow , tideObservatory );
55- List <TideRecord > tideRecords = new ArrayList <>();
56- tideRecords .addAll (yesterdayTide );
57- tideRecords .addAll (todayTide );
58- tideRecords .addAll (tomorrowTide );
59-
60- List <WeatherSummary > weatherSummaryList = new ArrayList <>();
61- List <Weather > weathers = weatherRepository .findWeatherByPlaceIdWithDateGreaterThan (
62- place .getId (), today );
63- for (Weather weather : weathers ) {
64- int score = calculateScore (activity , weather , tideRecords );
65- String message = Message .from (activity .getValue (), score );
66- if (weather .isUpdated ()) {
67- weatherSummaryList .add (WeatherSummary .builder ()
68- .date (weather .getDate ())
69- .hour (weather .getTime () / 100 )
70- .score (score )
71- .message (message )
72- .build ());
73- }
74- }
75- return weatherSummaryList ;
53+ List <TideRecord > tideRecords = tideRepository .findAllByDatesAndTideObservatory (relevantDates , tideObservatory );
54+
55+ int tidePercentage = calculateTidePercentage (tideRecords );
56+ return WeatherSummary .of (
57+ weather ,
58+ new ArrayList <>(),
59+ getRecommendActivity (weather , tideRecords ),
60+ tidePercentage
61+ );
7662 }
7763
7864 public List <WeatherDetail > getWeatherDetail (Long placeId ) {
@@ -102,26 +88,19 @@ public List<WeatherDetail> getWeatherDetail(Long placeId) {
10288 return result ;
10389 }
10490
105- private int calculateScore (Activity activity , Weather weather , List <TideRecord > tideRecords ) {
106- switch (activity ) {
107- case SNORKELING -> {
108- return calculateSnorkelingScore (weather , tideRecords );
109- }
110- case SURFING -> {
111- return calculateSurfingScore (weather , tideRecords );
112- }
113- case DIVING -> {
114- return calculateDivingScore (weather , tideRecords );
115- }
116- case SWIMMING -> {
117- return calculateSwimmingScore (weather , tideRecords );
118- }
119- case KAYAKING_AND_PADDLE_BOARDING -> {
120- return calculateKayakingPaddleBoardingScore (weather , tideRecords );
121- }
122- }
91+ private Activity getRecommendActivity (Weather weather , List <TideRecord > tideRecords ) {
92+ Map <Activity , Integer > activityScores = new HashMap <>();
12393
124- return 0 ;
94+ activityScores .put (SNORKELING , calculateSnorkelingScore (weather , tideRecords ));
95+ activityScores .put (SWIMMING , calculateSwimmingScore (weather , tideRecords ));
96+ activityScores .put (DIVING , calculateDivingScore (weather , tideRecords ));
97+ activityScores .put (KAYAKING_AND_PADDLE_BOARDING , calculateKayakingPaddleBoardingScore (weather , tideRecords ));
98+ activityScores .put (SURFING , calculateSurfingScore (weather , tideRecords ));
99+
100+ return activityScores .entrySet ().stream ()
101+ .max (Map .Entry .comparingByValue ())
102+ .orElseThrow (() -> new IllegalStateException ("No activity scores available" ))
103+ .getKey ();
125104 }
126105
127106 // Calculate Point
@@ -601,5 +580,15 @@ public List<AvailableTime> getAvailableTime(Integer date, Integer hour) {
601580 ))
602581 .toList ();
603582 }
583+
584+ private List <Integer > calculateRelevantDates () {
585+ LocalDateTime now = LocalDateTime .now ();
586+ DateTimeFormatter formatter = DateTimeFormatter .ofPattern ("yyyyMMdd" );
587+ return List .of (
588+ Integer .parseInt (now .minusDays (1 ).format (formatter )), // 어제
589+ Integer .parseInt (now .format (formatter )), // 오늘
590+ Integer .parseInt (now .plusDays (1 ).format (formatter )) // 내일
591+ );
592+ }
604593}
605594
0 commit comments