<?php
#BEGIN_LICENSE
#-------------------------------------------------------------------------
# Module: CGExtensions (c) 2008-2014 by Robert Campbell
#         (calguy1000@cmsmadesimple.org)
#  An addon module for CMS Made Simple to provide useful functions
#  and commonly used gui capabilities to other modules.
#
#-------------------------------------------------------------------------
# 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 CGExtensions
 * @category Utilities
 * @deprecated
 * @author  calguy1000 <calguy1000@cmsmadesimple.org>
 * @copyright Copyright 2010 by Robert Campbell
 */

declare(strict_types=1);

/**
 * A set of convenience methods to work with dates and times
 *
 * @package CGExtensions
 */
final class cge_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 = \cge_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 $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 parmeters 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,
                     \cge_param::get_int($params,$prefix.'Month'),
                     \cge_param::get_int($params,$prefix.'Day'),
                     \cge_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
     */
    static public function ts_set_time(int $timestamp,int $hour,int $minutes) : int
    {
        $obj = new cge_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
     * @deprecated
     */
    static public function ts_set_time_from_str(int $timestamp,string $str) : int
    {
        $obj = new cge_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
     */
    static public function is_leapyear(int $year = null) : bool
    {
        if( !$year ) $year = date('Y');

        $f = 0;
        if( $year % 4 == 0 ) $f = 1;
        if( $year % 100 == 0 ) $f == 0;
        if( $year % 400 == 0 ) $f = 1;
        return $f;
    }

    /**
     * Return the days in the given month/year
     *
     * @param int $month The specified month, if not specified the current month is used.
     * @param int $year The specified year.  If not specified, the current year is used.
     * @return int
     */
    static public 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 cge_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 cge_date
     */
    static public function date_at(int $month,int $day,int $year,int $hour = 0,int $minute = 0,int $seconds = 0) : cge_date
    {
        $tmp = mktime($hour,$minute,$seconds,$month,$day,$year);
        return new cge_date($tmp);
    }

    /**
     * Convert a timestamp to database format
     *
     * @param int $ts
     * @return string
     */
    static public 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.
     */
    static public function from_locale_str(string $str) : int
    {
        $lang = CmsNlsOperations::get_current_language();
        $date = $time = null;
        if( strpos($str,' ') !== FALSE ) {
            list($date,$time) = explode(' ',$str);
        }
        else {
            $date = $str;
        }
        $sep = $str[2];
        if( $lang != 'en_US') {
            list($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
     */
    static public 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
     */
    static public function rfc_date(int $ts) : string
    {
        $fmt = '%Y-%m-%dT%H:%M:%S';
        $tmp = strftime($fmt,$ts);
        $tmp .= date('P');
        return $tmp;
    }
} // end of class

#
# EOF
#

