package io.delphi.qa.auto.awsmfrw.managers.helpers.common;

import org.joda.time.DateTime;

import java.time.LocalDateTime;

public class DateTimeFormatConverter {

    public static String formatDateTimeSeconds(String dateTimeToFormat) {
        String[] inputDateFormatPatterns = {"yyyy-MM-dd HH:mm:ss.S", "yyyy-MM-dd HH:mm:ss.SSSSS", "yyyy-MM-dd HH:mm:ss.SSSSSS", "yyyy-MM-dd HH:mm:ss.SSSS", "yyyy-MM-dd HH:mm:ss.SSS"};

        java.time.format.DateTimeFormatter outputFormatter = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS");
        java.time.format.DateTimeFormatter outputFormatterFiveMillis = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSS");
        LocalDateTime inputDate = null;

        for (String inputDateFormatPattern : inputDateFormatPatterns) {
            try {
                java.time.format.DateTimeFormatter inputFormatter = java.time.format.DateTimeFormatter.ofPattern(inputDateFormatPattern);
                inputDate = LocalDateTime.parse(dateTimeToFormat, inputFormatter);
                break;
            } catch (Exception e) {
                // if parsing fails, try the next format
            }
        }
        assert inputDate != null;

        if (inputDate.getNano() % 10000 == 0) {
            return outputFormatterFiveMillis.format(inputDate);
        }
        else {
            return outputFormatter.format(inputDate);
        }
    }

    public static String formatDate(String dateTimeToFormat) {
        String[] inputDateFormatPatterns = {"yyyy-MM-dd HH:mm:ss.S", "yyyy-MM-dd HH:mm:ss.SSSSS", "yyyy-MM-dd HH:mm:ss.SSSSSS", "yyyy-MM-dd HH:mm:ss.SSSS", "yyyy-MM-dd HH:mm:ss.SSS"};

        java.time.format.DateTimeFormatter outputFormatter = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDateTime inputDate = null;

        for (String inputDateFormatPattern : inputDateFormatPatterns) {
            try {
                java.time.format.DateTimeFormatter inputFormatter = java.time.format.DateTimeFormatter.ofPattern(inputDateFormatPattern);
                inputDate = LocalDateTime.parse(dateTimeToFormat, inputFormatter);
                break;
            } catch (Exception e) {
                // if parsing fails, try the next format
            }
        }
        assert inputDate != null;
        return outputFormatter.format(inputDate);
    }

    public static String formatDateTime(String dateTimeToFormat) {
        String[] inputDateFormatPatterns = {"yyyy-MM-dd HH:mm:ss.S", "yyyy-MM-dd HH:mm:ss.SSSSS", "yyyy-MM-dd HH:mm:ss.SSSSSS", "yyyy-MM-dd HH:mm:ss.SSSS", "yyyy-MM-dd HH:mm:ss.SSS"};

        java.time.format.DateTimeFormatter outputFormatter = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        LocalDateTime inputDate = null;

        for (String inputDateFormatPattern : inputDateFormatPatterns) {
            try {
                java.time.format.DateTimeFormatter inputFormatter = java.time.format.DateTimeFormatter.ofPattern(inputDateFormatPattern);
                inputDate = LocalDateTime.parse(dateTimeToFormat, inputFormatter);
                break;
            } catch (Exception e) {
                // if parsing fails, try the next format
            }
        }
        assert inputDate != null;
        return outputFormatter.format(inputDate);
    }

    public static DateTime fromStringToDateTime(String dateTimeToFormat) {
        DateTime outputDate = null;

            try {
                outputDate = DateTime.parse(dateTimeToFormat);

            } catch (Exception e) {
                // if parsing fails, try the next format
            }
        assert outputDate != null;
        return outputDate;
    }
}
