/** @file
*
*  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
*  Copyright (c) 2016-2019, Linaro Limited. All rights reserved.
*  Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
*
*  SPDX-License-Identifier: BSD-2-Clause-Patent
*
**/

#pragma once

#include <Uefi/UefiBaseType.h>

//
// Convenience macros to obtain a build date
//
// These macros should work for any compiler that follows ISO/IEC 9899,
// in which case __DATE__ is defined as a "Mmm dd yyyy" 11 chars string,
// but add an explicit filter for compilers that have been validated.
//
#if (defined (__GNUC__) || defined (_MSC_VER) || defined (__clang__))
#define TIME_BUILD_YEAR   (__DATE__[7] == '?' ? 1900\
          : (((__DATE__[7] - '0') * 1000 )          \
          + (__DATE__[8] - '0') * 100               \
          + (__DATE__[9] - '0') * 10                \
          + __DATE__[10] - '0'))
#define TIME_BUILD_MONTH  ( __DATE__ [2] == '?' ? 1 \
          : __DATE__ [2] == 'n' ? (                 \
            __DATE__ [1] == 'a' ? 1 : 6)            \
          : __DATE__ [2] == 'b' ? 2                 \
          : __DATE__ [2] == 'r' ? (                 \
            __DATE__ [0] == 'M' ? 3 : 4)            \
          : __DATE__ [2] == 'y' ? 5                 \
          : __DATE__ [2] == 'l' ? 7                 \
          : __DATE__ [2] == 'g' ? 8                 \
          : __DATE__ [2] == 'p' ? 9                 \
          : __DATE__ [2] == 't' ? 10                \
          : __DATE__ [2] == 'v' ? 11                \
          : 12)
#define TIME_BUILD_DAY    ( __DATE__[4] == '?' ? 1  \
          : ((__DATE__[4] == ' ' ? 0 :              \
            ((__DATE__[4] - '0') * 10))             \
          + __DATE__[5] - '0'))
#endif

// Define EPOCH (1970-JANUARY-01) in the Julian Date representation
#define EPOCH_JULIAN_DATE  2440588

// Seconds per unit
#define SEC_PER_MIN   ((UINTN)    60)
#define SEC_PER_HOUR  ((UINTN)  3600)
#define SEC_PER_DAY   ((UINTN) 86400)

/**
  Check if it is a leap year.

  @param    Time  The UEFI time to be checked.

  @retval   TRUE  It is a leap year.
  @retval   FALSE It is NOT a leap year.

**/
BOOLEAN
EFIAPI
IsLeapYear (
  IN  EFI_TIME  *Time
  );

/**
  Check if the day in the UEFI time is valid.

  @param    Time    The UEFI time to be checked.

  @retval   TRUE    Valid.
  @retval   FALSE   Invalid.

**/
BOOLEAN
EFIAPI
IsDayValid (
  IN  EFI_TIME  *Time
  );

/**
  Check if the time zone is valid.
  Valid values are between -1440 and 1440 or 2047 (EFI_UNSPECIFIED_TIMEZONE).

  @param    TimeZone    The time zone to be checked.

  @retval   TRUE    Valid.
  @retval   FALSE   Invalid.

**/
BOOLEAN
EFIAPI
IsValidTimeZone (
  IN  INT16  TimeZone
  );

/**
  Check if the daylight is valid.
  Valid values are:
    0 : Time is not affected.
    1 : Time is affected, and has not been adjusted for daylight savings.
    3 : Time is affected, and has been adjusted for daylight savings.
  All other values are invalid.

  @param    Daylight    The daylight to be checked.

  @retval   TRUE    Valid.
  @retval   FALSE   Invalid.

**/
BOOLEAN
EFIAPI
IsValidDaylight (
  IN  INT8  Daylight
  );

/**
  Check if the UEFI time is valid.

  @param    Time    The UEFI time to be checked.

  @retval   TRUE    Valid.
  @retval   FALSE   Invalid.

**/
BOOLEAN
EFIAPI
IsTimeValid (
  IN  EFI_TIME  *Time
  );

/**
  Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to EFI_TIME.

  @param  EpochSeconds   Epoch seconds.
  @param  Time           The time converted to UEFI format.

**/
VOID
EFIAPI
EpochToEfiTime (
  IN  UINTN     EpochSeconds,
  OUT EFI_TIME  *Time
  );

/**
  Converts EFI_TIME to Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC).

  @param    Time  The UEFI time to be converted.

  @return   Number of seconds.

**/
UINTN
EFIAPI
EfiTimeToEpoch (
  IN  EFI_TIME  *Time
  );

/**
  Get the day of the week from the UEFI time.

  @param    Time  The UEFI time to be calculated.

  @return   The day of the week: Sunday=0, Monday=1, ... Saturday=6

**/
UINTN
EfiTimeToWday (
  IN  EFI_TIME  *Time
  );
