<?php
#BEGIN_LICENSE
#-------------------------------------------------------------------------
# Module: CMSMSExt (c) 2020-2021 by CMS Made Simple Foundation
#  An add-on module for CMS Made Simple to provide useful functions
#  and commonly used gui capabilities to other modules.
#-------------------------------------------------------------------------
# A fork of:
#
# Module: CGExtensions (c) 2008-2014 by Robert Campbell
#         (calguy1000@cmsmadesimple.org)
#
#-------------------------------------------------------------------------
#
# CMSMS - CMS Made Simple is (c) 2006 - 2021 by CMS Made Simple Foundation
# CMSMS - CMS Made Simple is (c) 2005 by Ted Kulp (wishy@cmsmadesimple.org)
# Visit the CMSMS Homepage at: http://www.cmsmadesimple.org
#
#-------------------------------------------------------------------------
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# However, as a special exception to the GPL, this software is distributed
# as an addon module to CMS Made Simple.  You may not use this software
# in any Non GPL version of CMS Made simple, or in any version of CMS
# Made simple that does not indicate clearly and obviously in its admin
# section that the site was built with CMS Made simple.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# Or read it online: http://www.gnu.org/licenses/licenses.html#GPL
#
#-------------------------------------------------------------------------
#END_LICENSE

/**
 * A set of convenience methods to work with dates and times
 *
 * @package CMSMSExt
 * @category Utilities
 * @author  calguy1000 <calguy1000@cmsmadesimple.org>
 * @copyright Copyright 2010 by Robert Campbell
 */

//declare(strict_types=1);# revisit

/**
 * A set of convenience methods to work with dates and times
 *
 * @package CMSMSExt
 */
final class xt_date_utils
{
    /**
     * @ignore
     */
    private function __construct() {}
  
  /**
   * Given month, day year input fields in parameters, and a prefix create a unix timestamp
   * this is useful when processing form data from {html_select_date}
   *
   * i.e: <code>$ts = \xt_date_utils::date_from_form($params,$id,'startdate');</code>
   *
   * @param array       $params  An associative array, usually from form submission.
   * @param string      $prefix  The prefix for the Month, Day, and Year fields within the params array
   * @param string|null $prefix2 An optional second prefix to append to the first one (i.e: the field name)
   *
   * @return int unix timestamp representing the date in the input parameters at 00:00 hours.  or null
   */
    public static function date_from_form(array $params,string $prefix,string $prefix2 = null)
    {
        $prefix = (string) $prefix;
        $prefix .= (string) $prefix2;
        if( !is_array($params) ) return;

        $ts = mktime(0,0,0,
                     \xt_param::get_int($params,$prefix.'Month'),
                     \xt_param::get_int($params,$prefix.'Day'),
                     \xt_param::get_int($params,$prefix.'Year'));
        return $ts;
    }

    /**
     * Given a unxix timestamp, an hour and minutes value
     * adjust the unix timestamp accordingly.
     *
     * @param int $timestamp
     * @param int $hour
     * @param int $minutes
     * @return int
     */
    public static function ts_set_time(int $timestamp, int $hour, int $minutes) : int
    {
        $obj = new xt_date($timestamp);
        $obj->set_time($hour,$minutes);
        return $obj->to_timestamp();
    }

    /**
     * Create a unix timestamp from a string.
     * adjust the unix timestamp accordingly.
     *
     * @param int $timestamp
     * @param string $str
     * @return int
     */
    public static function ts_set_time_from_str(int $timestamp, string $str) : int
    {
        $obj = new xt_date($timestamp);
        $obj->set_time_from_str($str);
        return $obj->to_timestamp();
    }

    /**
     * Test if the given year (or the current year) is a leapyear
     *
     * @param int $year Optional year.
     * @return bool
     */
    public static function is_leapyear(int $year = null) : bool
    {
        if( !$year ) $year = date('Y');

        $f = 0;
        if(0 === $year % 4)   { $f = 1; }
        if(0 === $year % 100) { $f = 0; }
        if(0 === $year % 400) { $f = 1; }
        
        return $f;
    }
  
  /**
   * Return the days in the given month/year
   *
   * @param int|null $month The specified month, if not specified the current month is used.
   * @param int|null $year  The specified year.  If not specified, the current year is used.
   *
   * @return int
   */
    public static function days_in_month(int $month = null, int $year = null) : int
    {
        $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

        if( !$month ) $month = date('m');
        if( !$year ) $year = date('Y');
        if( self::is_leapyear($year) )$days_in_year[1] = 29;

        // month is a value from 1 to 12.
        return $days_in_year[$month-1];
    }

    /**
     * Create a xt_date given specified time values
     *
     * @deprecated
     * @param int $month
     * @param int $day
     * @param int $year
     * @param int $hour
     * @param int $minute
     * @param int $seconds
     * @return xt_date
     */
    public static function date_at(int $month, int $day, int $year, int $hour = 0, int $minute = 0, int $seconds = 0) : xt_date
    {
        $tmp = mktime($hour,$minute,$seconds,$month,$day,$year);
        return new xt_date($tmp);
    }

    /**
     * Convert a timestamp to database format
     *
     * @param int $ts
     * @return string
     */
    public static function ts_to_dbformat(int $ts) : string
    {
        if( $ts < 1 ) return '';
        $str = strftime('%Y-%m-%d %H:%M:%S', $ts);
        return trim($str, "'");
    }

    /**
     * Convert a locale specific date/time string to a unix timestamp
     *
     * @param string $str The input string
     * @return int The unix timestamp.
     */
    public static function from_locale_str(string $str) : int
    {
        $lang = CmsNlsOperations::get_current_language();
        $date = $time = null;
        if( strpos($str,' ') !== FALSE ) {
            [$date,$time] = explode(' ',$str);
        }
        else {
            $date = $str;
        }
        $sep = $str[2];
        if( $lang != 'en_US') {
            [$day,$month,$year] = explode($sep,$date);
            $newstr = trim("$month/$day/$year $time");
            return strtotime($newstr);
        }
        return strtotime($str);
    }

    /**
     * Convert a unix timestamp to a locale specific format
     * (currently only support US and non US).
     *
     * @param int $ts The unix timestamp
     * @param bool $time_too Wether or not to include time in the output string
     * @param string $sep The separator between fields.  Default is '/'
     * @return string
     */
    public static function to_locale_str(int $ts, bool $time_too = TRUE, string $sep = '/') : string
    {
        $lang = CmsNlsOperations::get_current_language();
        $fmt = "%d{$sep}%m{$sep}%Y";
        if( $lang == 'en_US' ) {
            $fmt = "%m{$sep}%d{$sep}%Y";
        }
        if( $time_too ) $fmt .= " %T";
        return strftime($fmt,$ts);
    }


    /**
     * Convert a unix timestamp to an RFC date
     *
     * @deprecated
     * @param int $ts The unix timestamp
     * @return string
     */
    public static function rfc_date(int $ts) : string
    {
        $fmt = '%Y-%m-%dT%H:%M:%S';
        $tmp = strftime($fmt,$ts);
        $tmp .= date('P');
        return $tmp;
    }
  /**
   * @param      $format
   * @param null $timestamp
   *
   * @return string
   */
  public static function strftime ($format, $timestamp = null) : string
  {
    if( (\version_compare(PHP_VERSION, '8.1')  < 0) && (\version_compare(CMS_VERSION, '2.4')< 0) )
    {
      return strftime($format, $timestamp);
    }
    
    return \CMSMS\strftime($format, $timestamp);
  }
} // end of class

#
# EOF
#
