#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
#
# Copyright (C) 2022 #
# @Time    : 2022/3/26 16:20
# @Author  : ming
# @Email   : zhangdongming@asj6.wecom.work
# @File    : LocalDateTimeUtil.py
# @Software: PyCharm
import calendar
import datetime
import time

from dateutil.relativedelta import relativedelta


def get_cur_month():
    # 获取当前月
    return datetime.datetime.now().strftime("%Y-%m")


def get_last_month_num(number=1):
    # 获取前几个月
    month_date = datetime.datetime.now().date() - relativedelta(months=number)
    return month_date.strftime("%Y-%m")


def get_next_month(number=1):
    # 获取后几个月
    month_date = datetime.datetime.now().date() + relativedelta(months=number)
    return month_date.strftime("%Y-%m")


def get_cur_month_start():
    # 获取当前月的第一天
    month_str = datetime.datetime.now().strftime('%Y-%m')
    return '{}-01'.format(month_str)


def get_cur_month_end():
    # 获取当前月的最后一天
    """
    param: month_str 月份，2021-04
    """
    # return: 格式 %Y-%m-%d

    month_str = datetime.datetime.now().strftime('%Y-%m')
    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
    end = calendar.monthrange(year, month)[1]
    return '{}-{}-{}'.format(year, month, end)


def get_last_month_start(month_str=None):
    # 获取上一个月的第一天
    """
    param: month_str 月份，2021-04
    """
    # return: 格式 %Y-%m-%d
    if not month_str:
        month_str = datetime.datetime.now().strftime('%Y-%m')
    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
    if month == 1:
        year -= 1
        month = 12
    else:
        month -= 1
    return '{}-{}-01'.format(year, month)


def get_next_month_start(month_str=None):
    # 获取下一个月的第一天
    """
    param: month_str 月份，2021-04
    """
    # return: 格式 %Y-%m-%d
    if not month_str:
        month_str = datetime.datetime.now().strftime('%Y-%m')
    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
    if month == 12:
        year += 1
        month = 1
    else:
        month += 1
    return '{}-{}-01'.format(year, month)


def get_last_month_end(month_str=None):
    # 获取上一个月的最后一天
    """
    param: month_str 月份，2021-04
    """
    # return: 格式 %Y-%m-%d
    if not month_str:
        month_str = datetime.datetime.now().strftime('%Y-%m')
    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
    if month == 1:
        year -= 1
        month = 12
    else:
        month -= 1
    end = calendar.monthrange(year, month)[1]
    return '{}-{}-{}'.format(year, month, end)


def get_next_month_end(month_str=None):
    # 获取下一个月的最后一天
    """
    param: month_str 月份，2021-04
    """
    # return: 格式 %Y-%m-%d
    if not month_str:
        month_str = datetime.datetime.now().strftime('%Y-%m')
    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
    if month == 12:
        year += 1
        month = 1
    else:
        month += 1
    end = calendar.monthrange(year, month)[1]
    return '{}-{}-{}'.format(year, month, end)


def get_last_first_date_and_last_date(n):
    """
    获取前n周开始时间和结束时间，参数n：代表前n周
    """
    now = datetime.datetime.now()
    # 上周第一天和最后一天
    before_n_week_start = now - datetime.timedelta(days=now.weekday() + 7 * n, hours=now.hour, minutes=now.minute,
                                                   seconds=now.second, microseconds=now.microsecond)
    # last_week_end = now - timedelta(days=now.weekday() + 1)
    before_n_week_end = before_n_week_start + datetime.timedelta(days=6, hours=23, minutes=59, seconds=59)
    return before_n_week_start, before_n_week_end


def get_today_date(timestamp=False):
    """
    返回当天开始时间和结束时间
    Args:
        timestamp 是否返回时间戳
    returns:
        zero_today ,last_today
    """

    now = datetime.datetime.now()
    zero_today = now - datetime.timedelta(hours=now.hour, minutes=now.minute, seconds=now.second,
                                          microseconds=now.microsecond)
    last_today = zero_today + datetime.timedelta(hours=23, minutes=59, seconds=59)
    if timestamp:
        zero_today = int(time.mktime(zero_today.timetuple()))
        last_today = int(time.mktime(last_today.timetuple()))
        return zero_today, last_today
    return zero_today, last_today


def get_last_week():
    """
    获取前一周时间
    @return: last_week_date
    """
    today = datetime.date.today()  # 1. 获取「今天」
    last_week = today - datetime.timedelta(days=7)  # 2.获取7天前
    last_week_date = last_week.strftime("%Y-%m-%d %H:%M:%S")
    return last_week_date


def get_last_month():
    """
    获取前一个月时间
    returns:
        last_month_date
    """
    today = datetime.date.today()  # 1. 获取「今天」
    last_month = today.replace(month=today.month - 1)  # 2.获取前一个月
    last_month_date = last_month.strftime("%Y-%m-%d %H:%M:%S")
    return last_month_date


def get_before_days_timestamp(timestamp, days=1):
    """
    获取之前日期时间戳-秒级
    @param timestamp: 时间戳
    @param days: 天数
    @return: (timestamp - second * hour * days) 时间戳
    """
    if days:
        second = 3600
        hour = 24
        if days > 0:
            return timestamp - second * hour * days
    return 0


def get_after_days_timestamp(timestamp, days=1):
    """
    获取之后日期时间戳-秒级
    @param timestamp: 时间戳
    @param days: 天数
    @return: (timestamp + second * hour * days) 时间戳
    """
    if days:
        second = 3600
        hour = 24
        if days > 0:
            return timestamp + second * hour * days
    return 0


def date_to_week(str_date):
    """
    日期获取星期几
    @param str_date 日期 例：2022-03-03
    @return: int 1-7
    """
    if str_date:
        return datetime.datetime.strptime(str_date, "%Y-%m-%d").weekday() + 1
    return datetime.datetime.now().weekday() + 1


def format_date_to_week(str_date, str_format):
    """
    日期获取星期几
    @param str_format:  %Y-%m-%d
    @param str_date 日期 例：2022-03-03
    @return: int 1-7
    """
    if str_date:
        return datetime.datetime.strptime(str_date, str_format).weekday() + 1
    return 0


def get_start_and_end_time(date, str_format):
    """
    根据日期获取当日开始and结束时间戳
    @param date: 日期 例：2022-03-07
    @param str_format: 格式 例：%Y-%m-%d
    @return: start_time,end_time
    """
    if date:
        today = datetime.datetime.strptime(date, str_format)
        day = today + datetime.timedelta(days=1)
        start_time = int(time.mktime(time.strptime(str(today.date()), '%Y-%m-%d')))
        end_time = int(time.mktime(time.strptime(str(day.date()), '%Y-%m-%d'))) - 1
        return start_time, end_time
    return 0


def time_stamp_to_time(time_stamp, time_format):
    """
    时间戳转时间
    @param time_stamp: 时间戳
    @param time_format: 时间格式 例%Y-%m-%d %H:%M:%S
    @return: 格式化后时间字符串
    """
    time_array = time.localtime(time_stamp)
    return time.strftime(time_format, time_array)


def time_format_date(timestamp, tz):
    # 解析时区偏移量
    tz_hours, tz_minutes = map(int, tz.split(':'))
    # 将时间戳转换为 datetime 对象
    dt = datetime.datetime.fromtimestamp(timestamp)
    # 创建 timedelta 对象，表示时区偏移量
    tz_offset = datetime.timedelta(hours=tz_hours, minutes=tz_minutes)
    # 调整 datetime 对象的时区
    dt = dt + tz_offset
    # 格式化日期时间字符串
    formatted_date = dt.strftime('%Y-%m-%d %H:%M:%S')
    return formatted_date


def start_of_day_timestamp(timestamp):
    # 将当前时间戳转换为 datetime 对象
    dt = datetime.datetime.fromtimestamp(timestamp)

    # 获取日期部分，并将时、分、秒和微秒设置为零
    dt_start_of_day = dt.replace(hour=0, minute=0, second=0, microsecond=0)

    return int(dt_start_of_day.timestamp())


def get_previous_month_first_day(timestamp):
    # 将时间戳转换为datetime对象
    dt = datetime.datetime.fromtimestamp(timestamp)

    # 获取上个月的年份和月份
    previous_month_year = dt.year if dt.month > 1 else dt.year - 1
    previous_month = dt.month - 1 if dt.month > 1 else 12

    # 构造上个月第一天的datetime对象
    previous_month_first_day = datetime.datetime(previous_month_year, previous_month, 1)

    # 将上个月第一天的datetime对象转换为时间戳并返回
    return int(previous_month_first_day.timestamp())


def get_current_month_first_day(timestamp):
    # 将时间戳转换为datetime对象
    dt = datetime.datetime.fromtimestamp(timestamp)

    # 获取当前月份的年份和月份
    current_month_year = dt.year
    current_month = dt.month

    # 构造当前月份第一天的datetime对象
    current_month_first_day = datetime.datetime(current_month_year, current_month, 1)

    # 将当前月份第一天的datetime对象转换为时间戳并返回
    return int(current_month_first_day.timestamp())
