package com.wms.utils;

import com.wms.constants.enums.WcsTaskStatus;
import com.wms.constants.enums.WmsTaskStatus;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * WMS工具类
 *
 * @author 梁州
 * &#064;date  2023/2/13
 */
public class WmsUtils {
    // 日期格式
    public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    // 时间格式
    public static final SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    // id用的时间格式
    public static final SimpleDateFormat idTimeFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    public static volatile Long lastTimestamp = -1L;
    public static int id = 0;

    /**
     * 生成唯一的编号
     *
     * @param code 插入字符串
     * @return 唯一id
     */
    public static String generateId(String code) {
        return code + generateUUIDString();
    }

    /**
     * 生成UUID
     */
    public synchronized static String generateUUIDString() {
        long timeStamp = System.currentTimeMillis();
        if (timeStamp == lastTimestamp) {
            if (id < 9999) {
                id++;
            } else {
                try {
                    Thread.sleep(1);
                    timeStamp = System.currentTimeMillis();
                    id = 0;
                } catch (InterruptedException e) {
                    //
                }
            }
        } else {
            lastTimestamp = timeStamp;
            id = 0;
        }

        return idTimeFormat.format(new Date()).concat(String.valueOf(timeStamp)) + StringUtils.padLeft(String.valueOf(id), 4, "0");
    }

    // 方法接收一个字符参数，返回对应的1-26之间的数字
    public static int letterToNumber(char letter) {
        if ('a' <= letter && letter <= 'z') {
            return letter - 'a' + 1;
        } else if ('A' <= letter && letter <= 'Z') {
            return letter - 'A' + 1;
        } else {
            return -1;
        }
    }

    /**
     * 时间字符串转时间格式
     *
     * @param time 时间
     */
    public static Date timeStringToTime(String time) throws ParseException {
        return timeFormat.parse(time);
    }

    /**
     * 日期字符串
     *
     * @param date 日期
     */
    public static Date dateStringToDate(String date) throws ParseException {
        return dateFormat.parse(date);
    }

    /**
     * 生成时间戳，格式yyyy-MM-dd HH:mm:ss
     *
     * @return 时间戳
     */
    public static String createCurrentTimeString() {
        return timeFormat.format(new Date());
    }

    /**
     * 生成日期字符串，格式yyyy-MM-dd
     *
     * @return 时间戳
     */
    public static String createCurrentDateString() {
        return dateFormat.format(new Date());
    }

    /**
     * 格式化日期，格式yyyy-MM-dd
     *
     * @param date 日期
     * @return 时间戳
     */
    public static String formatDateString(Date date) {
        return dateFormat.format(date);
    }

    /**
     * 格式化时间，格式yyyy-MM-dd HH:mm:ss
     *
     * @param date 日期
     * @return 时间戳
     */
    public static String formatTimeString(Date date) {
        return timeFormat.format(date);
    }

    /**
     * 获得指定日期之后指定天数的日期
     *
     * @param beginDay 开始日期
     * @param days     天数
     * @return 日期
     */
    public static Date calculationDate(Date beginDay, int days) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(beginDay);
        calendar.add(Calendar.DATE, days);
        return calendar.getTime();
    }

    /**
     * 获得指定日期之后指定月数的日期
     *
     * @param beginDay 开始日期
     * @param months   月数
     * @return 日期
     */
    public static Date calculationMonth(Date beginDay, int months) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(beginDay);
        calendar.add(Calendar.MONTH, months);
        return calendar.getTime();
    }

    /**
     * 获得指定日期之后指定年数的日期
     *
     * @param beginDay 开始日期
     * @param years    年数
     * @return 日期
     */
    public static Date calculationYear(Date beginDay, int years) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(beginDay);
        calendar.add(Calendar.YEAR, years);
        return calendar.getTime();
    }

    /**
     * 获取指定天数后的日期
     *
     * @param day 天数
     * @return 日期
     */
    public static Date getDay(int day) {
        return calculationDate(new Date(), day);
    }

    /**
     * 获取任意月后的时间
     * &#064;Params:  mon 1表示后一个月 -1表示前一个月
     * &#064;Return
     */
    public static Date getMon(int mon) {
        return calculationMonth(new Date(), mon);
    }

    /**
     * 获取任意年之后的日期
     *
     * @param year 年
     * @return 日期
     */
    public static Date getYear(int year) {
        return calculationYear(new Date(), year);
    }
}
