package com.iscs.bozzys.utils

import android.os.Build
import java.text.SimpleDateFormat
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Locale
import java.util.TimeZone

object DateUtil {

    /**
     * 格式化时间戳为字符串
     */
    fun Long.format(pattern: String): String {
        return Instant.ofEpochMilli(this)
            .atZone(ZoneId.systemDefault())
            .format(DateTimeFormatter.ofPattern(pattern))
    }

    /**
     * 将传入的时间String格式化为pattern格式的时间戳
     */
    fun String.dateToTimestamp(pattern: String): Long {
        if (this.isEmpty() || this == "0") return 0L
        val date = if (this.contains("T") && this.contains("Z")) {
            this.iso8601ToTimestamp().format(pattern)
        } else {
            return this.toLong()
        }
        val formatter = DateTimeFormatter.ofPattern(pattern)
        return LocalDateTime
            .parse(date, formatter)
            .atZone(ZoneId.systemDefault())
            .toInstant()
            .toEpochMilli()
    }

    /**
     * 将ISO-8601时间格式化为时间戳
     */
    fun String.iso8601ToTimestamp(): Long {
        return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US)
            sdf.timeZone = TimeZone.getTimeZone("UTC")
            sdf.parse(this)?.time ?: 0L
        } else {
            val formatter = DateTimeFormatter.ISO_INSTANT
            Instant.from(formatter.parse(this)).toEpochMilli()
        }
    }

    /**
     * 将时间戳转化为可显示的日期
     */
    fun Long?.getShowDate(): String {
        val localTs = System.currentTimeMillis()
        val localDat = localTs.format("yyyy-MM-dd HH:mm:ss").split(" ")
        val localDate = localDat[0]
        // val localTime = localDat[1]
        // 显示逻辑
        // 当天 显示具体时间
        // 昨天 显示昨天具体时间
        // 前天 显示前天具体时间
        // 本年 显示日期和时间
        // 他年 显示年月日和时间
        if (this != null && this > 0) {
            // 执行时间戳的转换
            val dat = this.format("yyyy-MM-dd HH:mm:ss").split(" ")
            val date = dat[0].split("-")
            val year = date[0]
            val month = date[1]
            val day = date[2]
            return if (localDate == dat[0]) {
                // 说明是当天
                "今天"
            } else if (localDate == "$year-$month-${(day.toInt() + 1).toString().padStart(2, '0')}") {
                // 说明是昨天
                "昨天"
            } else if (localDate.startsWith("$year-")) {
                // 说明是本年度
                "$month-$day"
            } else {
                dat[0]
            }
        }
        return "--"
    }

    /**
     * 将时间戳转化为可显示的日期
     */
    fun Long?.getShowDateOrTime(): String {
        val localTs = System.currentTimeMillis()
        val localDat = localTs.format("yyyy-MM-dd HH:mm:ss").split(" ")
        val localDate = localDat[0]
        // val localTime = localDat[1]
        // 显示逻辑
        // 当天 显示具体时间
        // 昨天 显示昨天具体时间
        // 前天 显示前天具体时间
        // 本年 显示日期和时间
        // 他年 显示年月日和时间
        if (this != null && this > 0) {
            // 执行时间戳的转换
            val dat = this.format("yyyy-MM-dd HH:mm:ss").split(" ")
            val date = dat[0].split("-")
            val year = date[0]
            val month = date[1]
            val day = date[2]
            val time = dat[1]
            return if (localDate == dat[0]) {
                // 说明是当天
                "今天 $time"
            } else if (localDate == "$year-$month-${(day.toInt() + 1).toString().padStart(2, '0')}") {
                // 说明是昨天
                "昨天 $time"
            } else if (localDate.startsWith("$year-")) {
                // 说明是本年度
                "$month-$day $time"
            } else {
                "${dat[0]} ${dat[1]}"
            }
        }
        return "--"
    }

}