001// --------------------------------------------------------------------------------
002// Copyright 2002-2024 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.util.server.string;
018
019import com.echothree.model.control.user.server.control.UserControl;
020import com.echothree.model.data.party.server.entity.DateTimeFormat;
021import com.echothree.model.data.party.server.entity.TimeZone;
022import com.echothree.model.data.user.server.entity.UserVisit;
023import com.echothree.util.common.string.DateFormatter;
024import com.echothree.util.common.string.DateTimeFormatType;
025import com.echothree.util.common.string.DateTimeFormatter;
026import com.echothree.util.server.persistence.Session;
027import java.time.Instant;
028import java.time.LocalDate;
029import java.time.LocalTime;
030import java.time.ZoneId;
031
032public class DateUtils {
033    
034    private DateUtils() {
035        super();
036    }
037    
038    private static class DateUtilsHolder {
039        static DateUtils instance = new DateUtils();
040    }
041    
042    public static DateUtils getInstance() {
043        return DateUtilsHolder.instance;
044    }
045    
046    private final java.time.format.DateTimeFormatter dateTimeFormatter = java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
047
048    public String formatDate(UserVisit userVisit, Integer date) {
049        String result = null;
050        
051        if(date != null) {
052            var userControl = Session.getModelController(UserControl.class);
053            var localDate = LocalDate.parse(date.toString(), dateTimeFormatter);
054            var resultDateTimeFormatter = java.time.format.DateTimeFormatter.ofPattern(userControl.getPreferredDateTimeFormatFromUserVisit(userVisit).getLastDetail().getJavaShortDateFormat());
055            
056            result = resultDateTimeFormatter.format(localDate);
057        }
058        
059        return result;
060    }
061    
062    protected UserControl getUserControl() {
063        return Session.getModelController(UserControl.class);
064    }
065    
066    protected TimeZone getTimeZone(UserVisit userVisit) {
067        return getUserControl().getPreferredTimeZoneFromUserVisit(userVisit);
068    }
069    
070    protected String getJavaTimeZoneName(final UserVisit userVisit) {
071        return getTimeZone(userVisit).getLastDetail().getJavaTimeZoneName();
072    }
073    
074    protected ZoneId getJavaTimeZone(final UserVisit userVisit) {
075        return ZoneId.of(getJavaTimeZoneName(userVisit));
076    }
077    
078    protected DateTimeFormat getDateTimeFormat(final UserVisit userVisit) {
079        return getUserControl().getPreferredDateTimeFormatFromUserVisit(userVisit);
080    }
081    
082    protected String formatDateUsingShortDateFormat(final UserVisit userVisit, final DateTimeFormat dateTimeFormat, final Instant instant) {
083        var dateTimeFormatter = java.time.format.DateTimeFormatter.ofPattern(dateTimeFormat.getLastDetail().getJavaShortDateFormat());
084        var localDate = LocalDate.ofInstant(instant, getJavaTimeZone(userVisit));
085
086        return localDate.format(dateTimeFormatter);
087    }
088
089    protected String formatTimeUsingTimeFormatSeconds(final UserVisit userVisit, final DateTimeFormat dateTimeFormat, final Instant instant) {
090        var dateTimeFormatter = java.time.format.DateTimeFormatter.ofPattern(dateTimeFormat.getLastDetail().getJavaTimeFormatSeconds());
091        var localTime = LocalTime.ofInstant(instant, getJavaTimeZone(userVisit));
092
093        return localTime.format(dateTimeFormatter);
094    }
095    
096    public String formatTypicalDateTime(final UserVisit userVisit, final DateTimeFormat dateTimeFormat, final Instant instant) {
097        return instant == null || dateTimeFormat == null ? null : formatDateUsingShortDateFormat(userVisit, dateTimeFormat, instant) + ' ' + formatTimeUsingTimeFormatSeconds(userVisit, dateTimeFormat, instant);
098    }
099    
100    public String formatTypicalDateTime(final UserVisit userVisit, final Instant instant) {
101        return formatTypicalDateTime(userVisit, getDateTimeFormat(userVisit), instant);
102    }
103    
104    public String formatTypicalDateTime(final UserVisit userVisit, final DateTimeFormat dateTimeFormat, final Long time) {
105        return time == null || dateTimeFormat == null ? null : formatTypicalDateTime(userVisit, dateTimeFormat, Instant.ofEpochMilli(time));
106    }
107    
108    public String formatTypicalDateTime(final UserVisit userVisit, final Long time) {
109        return formatTypicalDateTime(userVisit, getDateTimeFormat(userVisit), time);
110    }
111    
112    public DateFormatter getDateFormatter(final UserVisit userVisit, final DateTimeFormatType dtft) {
113        var dtfd = getDateTimeFormat(userVisit).getLastDetail();
114        String pattern;
115
116        switch(dtft) {
117            case SHORT_DATE -> pattern = dtfd.getJavaShortDateFormat();
118            case ABBREV_DATE -> pattern = dtfd.getJavaAbbrevDateFormat();
119            case ABBREV_DATE_WITH_WEEKDAY -> pattern = dtfd.getJavaAbbrevDateFormatWeekday();
120            case LONG_DATE -> pattern = dtfd.getJavaLongDateFormat();
121            case LONG_DATE_WITH_WEEKDAY -> pattern = dtfd.getJavaLongDateFormatWeekday();
122            default -> throw new IllegalArgumentException();
123        }
124
125        return new DateFormatter(pattern);
126    }
127    
128    public DateTimeFormatter getDateTimeFormatter(final UserVisit userVisit, final DateTimeFormatType dtft) {
129        var dtfd = getDateTimeFormat(userVisit).getLastDetail();
130        String pattern;
131
132        switch(dtft) {
133            case SHORT_DATE -> pattern = dtfd.getJavaShortDateFormat();
134            case ABBREV_DATE -> pattern = dtfd.getJavaAbbrevDateFormat();
135            case ABBREV_DATE_WITH_WEEKDAY -> pattern = dtfd.getJavaAbbrevDateFormatWeekday();
136            case LONG_DATE -> pattern = dtfd.getJavaLongDateFormat();
137            case LONG_DATE_WITH_WEEKDAY -> pattern = dtfd.getJavaLongDateFormatWeekday();
138            case TIME -> pattern = dtfd.getJavaTimeFormat();
139            case TIME_WITH_SECONDS -> pattern = dtfd.getJavaTimeFormatSeconds();
140            default -> throw new IllegalArgumentException();
141        }
142
143        return new DateTimeFormatter(getJavaTimeZoneName(userVisit), pattern);
144    }
145    
146}