/*
 * Copyright 2017-present Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.drivers.microsemi.yang.utils;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.ietfyangtypes.DateAndTime;

/**
 * A utility class to change various YANG types to general purpose classes.
 */
public final class IetfYangTypesUtils {
    private IetfYangTypesUtils() {
        //Hiding the public constructor for this utility class
    }

    /**
     * Convert from Date and Time in a ietf-yang-types format to the Java Time API.
     * @param dateAndTime A date and time from a YANG object
     * @return A Date and Time with a Time Zone offset
     */
    public static OffsetDateTime fromYangDateTime(DateAndTime dateAndTime) {
        return OffsetDateTime.parse(dateAndTime.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    }

    /**
     * Convert a from Date and Time in a ietf-yang-types format to the Java Time API and rezone to a given Time Zone.
     * @param dateAndTime A date and time from a YANG object
     * @param zoneId The time zone to rezone the time and date to
     * @return The rezoned time and date
     */
    public static ZonedDateTime fromYangDateTimeZoned(DateAndTime dateAndTime, ZoneId zoneId) {
        return OffsetDateTime.parse(dateAndTime.toString(),
                DateTimeFormatter.ISO_OFFSET_DATE_TIME).atZoneSameInstant(zoneId);
    }

    /**
     * Convert a from Date and Time in a ietf-yang-types format to the Java Time API rezoned to the local Time Zone.
     * @param dateAndTime A date and time from a YANG object
     * @return The date and time in the zone of this local machine
     */
    public static LocalDateTime fromYangDateTimeToLocal(DateAndTime dateAndTime) {
        OffsetDateTime odt = OffsetDateTime.parse(dateAndTime.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME);

        return LocalDateTime.ofInstant(odt.toInstant(), ZoneId.systemDefault());
    }

    /**
     * Convert a from Date and Time in a ietf-yang-types format to the Java Time API as an Instant.
     * @param dateAndTime A date and time from a YANG object
     * @return The date and time as an Instant
     */
    public static Instant fromYangDateTimeToInstant(DateAndTime dateAndTime) {
        return Instant.from(OffsetDateTime.parse(dateAndTime.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME));
    }
}
