# -*-python-*-
#
# Copyright (C) 1999-2023 The ViewCVS Group. All Rights Reserved.
#
# By using this file, you agree to the terms and conditions set forth in
# the LICENSE.html file which can be found at the top level of the ViewVC
# distribution or at http://viewvc.org/license-1.html.
#
# For more information, visit http://viewvc.org/
#
# -----------------------------------------------------------------------

import time
import re
import calendar
import pymysql as MySQLdb

# set to 1 to store commit times in UTC, or 0 to use the ViewVC machine's
# local timezone. Using UTC is recommended because it ensures that the
# database will remain valid even if it is moved to another machine or the host
# computer's time zone is changed. UTC also avoids the ambiguity associated
# with daylight saving time (for example if a computer in New York recorded the
# local time 2002/10/27 1:30 am, there would be no way to tell whether the
# actual time was recorded before or after clocks were rolled back). Use local
# times for compatibility with databases used by ViewCVS 0.92 and earlier
# versions.
utc_time = 1


def DateTimeFromTicks(ticks):
    """Return a MySQL DATETIME value from a unix timestamp"""

    if utc_time:
        t = time.gmtime(ticks)
    else:
        t = time.localtime(ticks)
    return "%04d-%02d-%02d %02d:%02d:%02d" % t[:6]


_re_datetime = re.compile(
    "([0-9]{4})-([0-9][0-9])-([0-9][0-9]) " "([0-9][0-9]):([0-9][0-9]):([0-9][0-9])"
)


def TicksFromDateTime(datetime):
    """Return a unix timestamp from a MySQL DATETIME value"""

    if isinstance(datetime, str):
        # datetime is a MySQL DATETIME string
        matches = _re_datetime.match(datetime).groups()
        t = tuple(map(int, matches)) + (0, 0, 0)
    elif hasattr(datetime, "timetuple"):
        # datetime is a Python >=2.3 datetime.DateTime object
        t = datetime.timetuple()
    else:
        # datetime is an eGenix mx.DateTime object
        t = datetime.tuple()

    if utc_time:
        return calendar.timegm(t)
    else:
        return time.mktime(t[:8] + (-1,))


def connect(host, port, user, passwd, db):
    # on Python 3, mysqlclient supports only utf-8 connection.
    # (https://github.com/PyMySQL/mysqlclient-python/issues/210)
    # however, it seems to use charset 'latin-1' by default (only me?)
    if not host and isinstance(port, str):
        # it seems that port specifies UNIX socket path
        return MySQLdb.connect(
            unix_socket=port, user=user, passwd=passwd, db=db, charset="utf8")
    else:
        return MySQLdb.connect(
            host=host, port=port, user=user, passwd=passwd, db=db, charset="utf8"
        )
