<?php

namespace Application\Service\Extension\Helper;

/**
 * 处理时间
 */
class DateHelper
{
    /**
     * Notes : 日月年 转换为年月日
     * @param $time
     * @return string
     * Author:唐伯虎不虎
     * Date:2024/11/14 14:16
     */
    public static function converttime($time)
    {
        if (preg_match('/^(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])$/', $time)) {
            $starttime =  $time.'/'.date('Y');

            $date = \DateTime::createFromFormat('m/d/Y', $starttime);

            // 格式化为 Y-m-d 形式
            return $date->format('Y-m-d');
        }

        return $time;
    }

    /**
     * Notes : 小时分钟时间格式判断
     * @param $timeString
     * @return bool
     * Author:唐伯虎不虎
     * Date:2024/11/14 14:17
     */
    public static function isValidTime($timeString) {
        $pattern = '/^(2[0-3]|[01][0-9]):([0-5][0-9])$/';
        return preg_match($pattern, $timeString) === 1;
    }

    /**
     * Notes :日/月格式  19/08
     * @param $dateString
     * @return bool
     * Author:唐伯虎不虎
     * Date:2024/11/14 14:17
     */
    public static function isDayMonthTime($dateString)
    {
        $pattern = '/^(0?[1-9]|[12][0-9]|3[01])\/(0?[1-9]|1[0-2])$/';
        return preg_match($pattern, $dateString) === 1;
    }

    /**
     * Notes : 验证日期是否有效 作用在出院医嘱更新数据上
     * @param $date
     * @return bool
     * Author:唐伯虎不虎
     * Date:2024/11/14 14:17
     */
    public static function isValidDate($date) {
        // 匹配 YYYY-MM-DD 格式
        $regex1 = '/^\d{4}-\d{2}-\d{2}$/';
        // 匹配 YYYYMMDD 格式
        $regex2 = '/^\d{8}$/';

        if (preg_match($regex1, $date) || preg_match($regex2, $date)) {
            // 尝试创建 DateTime 对象
            try {
                if (preg_match($regex2, $date)) {
                    // 将 YYYYMMDD 转换为 YYYY-MM-DD 格式
                    $date = substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2);
                }
                $dt = new \DateTime($date);
                return $dt && $dt->format('Y-m-d') === $date;
            } catch (\Exception $e) {
                return false;
            }
        } else {
            return false;
        }
    }

    public static function YMDHSisValidDate($datetimeString){

        if (preg_match('/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\s(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])(:([0-5][0-9]))?$/', $datetimeString)) {
            return true;
        } else {
            return false;
        }

    }


    /**
     * Notes : 日月格式 转换成 月日格式
     * @param $dateString
     * @return string
     * Author:唐伯虎不虎
     * Date:2024/11/14 15:02
     */
    public static function dateToMonthDay($dateString)
    {
        // 使用 DateTime 创建日期对象
        $date = \DateTime::createFromFormat('d/m', $dateString);

        // 检查日期对象是否创建成功
        if ($date) {
            // 转换为 "月/日" 格式
            return $date->format('m/d');
        }
        return '';
    }

    /**
     * @note 格式化时间戳
     * @param int $timestamp
     * @param string $format
     * @return string
     */
    public static function formatTimestamp(int $timestamp, string $format = 'Y-m-d H:i:s'): string
    {
        $date = new \DateTime();
        $date->setTimestamp($timestamp);
        return $date->format($format);
    }

    /**
     * 通用 UK 日期格式化
     *
     * 1970.10.28  =>  1970-10-28
     * 1970/2/4  =>  1970-02-04
     * 1961/11/21  =>  1961-11-21
     * 1975/8/11  =>  1975-08-11
     * 2025-06-15 UK:UK  =>  2025-06-15 UK:UK
     * UK-UK-UKUK:UK  =>  UK-UK-UK UK:UK
     * 2025-05-0400:00  =>  2025-05-04 00:00
     * 2024-04-059:23  =>  2024-04-05 09:23
     * 2024-09-05 9:UK:15  =>  2024-09-05 09:UK:15
     * 2024-8-UK8:UK  =>  2024-08-UK 08:UK
     * 2023-11-13 15:24:59  =>  2023-11-13 15:24:59
     *
     * @param $input
     * @return string       格式化结果
     */
    public static function normalizeDatetime($input): string
    {
        // 先将 . 替换成 /
        $input = str_ireplace('.', '/', $input);

        $str = trim(preg_replace('/\s+/', ' ', $input));

        // ✅ 1. 检测是否需要插空格（无空格且有冒号）
        if (strpos($str, ' ') === false && strpos($str, ':') !== false) {
            // 找到时间部分 (含冒号) 在字符串中的位置
            if (preg_match('/[A-Za-z0-9]+:[A-Za-z0-9]+.*$/', $str, $match, PREG_OFFSET_CAPTURE)) {
                $timeStart = $match[0][1];                // 时间部分开始位置
                $prefix = substr($str, 0, $timeStart);    // 时间前部分
                $timePart = substr($str, $timeStart);     // 时间部分

                // ✅ 特例1: YYYY-MM-DDHH:MM → 在DD后加空格
                if (strpos($str, ' ') === false && preg_match('/^(\d{4}-\d{2}-\d{2})(\d{2}:\d{2}.*)$/', $str, $m)) {
                    return $m[1] . ' ' . $m[2];
                }
                // ✅ 特例2: UK-UK-UKUK:UK → 在最后一个 '-' 之前的部分保留, 之后的作为时间前缀
                elseif (strpos($str, ' ') === false && preg_match('/^(.*?)([A-Za-z0-9]{2}:[A-Za-z0-9]+.*)$/', $str, $m)) {
                    return $m[1] . ' ' . $m[2];
                }
                // ✅ 默认情况 → 直接 prefix + ' ' + timePart
                else {
                    $str = rtrim($prefix) . ' ' . $timePart;
                }
            }
        }

        // ✅ 2. 拆分日期和时间部分
        $datePart = $str;
        $timePart = '';
        if (strpos($str, ' ') !== false) {
            list($datePart, $timePart) = explode(' ', $str, 2);
        }

        // ✅ 3. 日期标准化 YYYY-M-D → YYYY-MM-DD
        if (preg_match('/^(\d{4})[-\/](\d{1,2})(?:[-\/](\d{1,2}))?$/', $datePart, $m)) {
            $year  = $m[1];
            $month = str_pad($m[2], 2, '0', STR_PAD_LEFT);
            $day   = isset($m[3]) ? str_pad($m[3], 2, '0', STR_PAD_LEFT) : '01';
            $datePart = "$year-$month-$day";
        }

        // ✅ 4. 时间补零（只处理 HH:MM，不影响HH:MM:SS/UK）
        $timePart = preg_replace_callback('/\b(\d{1,2}):(\d{1,2})\b(?!:)/', function($m) {
            return str_pad($m[1], 2, '0', STR_PAD_LEFT) . ':' . str_pad($m[2], 2, '0', STR_PAD_LEFT);
        }, $timePart);

        return trim($datePart . ($timePart ? ' ' . $timePart : ''));
    }

}