package gostring

import (
	"errors"
	"fmt"
	"go.dtapp.net/gorandom"
	"go.dtapp.net/gotime"
)

// GenerateId 生成18一编号
func GenerateId(customId string) string {
	currentTime := gotime.Current().Format()
	one, err := generateIdOne(customId, currentTime)
	if err == nil {
		return one
	}
	two, err := generateIdTwo(customId, currentTime)
	if err == nil {
		return two
	}
	three, err := generateIdThree(customId, currentTime)
	if err == nil {
		return three
	}
	four, err := generateIdFour(customId, currentTime)
	if err == nil {
		return four
	}
	five, err := generateIdFive(customId, currentTime)
	if err == nil {
		return five
	}
	six, err := generateIdSix(customId)
	return six
}

// GenerateIdAndTime 生成18一编号
func GenerateIdAndTime(customId, customTime string) string {
	one, err := generateIdOne(customId, customTime)
	if err == nil {
		return one
	}
	two, err := generateIdTwo(customId, customTime)
	if err == nil {
		return two
	}
	three, err := generateIdThree(customId, customTime)
	if err == nil {
		return three
	}
	four, err := generateIdFour(customId, customTime)
	if err == nil {
		return four
	}
	five, err := generateIdFive(customId, customTime)
	if err == nil {
		return five
	}
	six, err := generateIdSix(customId)
	return six
}

// 生成18位时间[年月日时分]唯一编号
func generateIdOne(customId, setTime string) (string, error) {

	var (
		newRandomLength = 0             // 随机数据长度
		customIdLength  = len(customId) // 自定义长度
	)

	const (
		randomLength     = 5               // 随机数据长度
		dataLength       = 18              // 默认数据长度
		dateFormat       = "200601021504"  // 时间格式
		dateFormatLength = len(dateFormat) // 时间格式长度
	)

	// 重新计算随机数据长度
	newRandomLength = dataLength - (dateFormatLength + customIdLength)

	if (dateFormatLength+customIdLength > dataLength) || (dateFormatLength+customIdLength == dataLength) || (newRandomLength < randomLength) {
		return "", errors.New("没有满足条件")
	}
	return fmt.Sprintf("%v%s%s", customId, gotime.SetCurrentParse(setTime).SetFormat(dateFormat), gorandom.Numeric(newRandomLength)), nil
}

// 生成18位时间[年月日时]唯一编号
func generateIdTwo(customId, setTime string) (string, error) {

	var (
		newRandomLength = 0             // 随机数据长度
		customIdLength  = len(customId) // 自定义长度
	)

	const (
		randomLength     = 5               // 随机数据长度
		dataLength       = 18              // 默认数据长度
		dateFormat       = "2006010215"    // 时间格式
		dateFormatLength = len(dateFormat) // 时间格式长度
	)

	// 重新计算随机数据长度
	newRandomLength = dataLength - (dateFormatLength + customIdLength)

	if (dateFormatLength+customIdLength > dataLength) || (dateFormatLength+customIdLength == dataLength) || (newRandomLength < randomLength) {
		return "", errors.New("没有满足条件")
	}
	return fmt.Sprintf("%v%s%s", customId, gotime.SetCurrentParse(setTime).SetFormat(dateFormat), gorandom.Numeric(newRandomLength)), nil
}

// 生成18位时间[年月日]唯一编号
func generateIdThree(customId, setTime string) (string, error) {

	var (
		newRandomLength = 0             // 随机数据长度
		customIdLength  = len(customId) // 自定义长度
	)

	const (
		randomLength     = 5               // 随机数据长度
		dataLength       = 18              // 默认数据长度
		dateFormat       = "20060102"      // 时间格式
		dateFormatLength = len(dateFormat) // 时间格式长度
	)

	// 重新计算随机数据长度
	newRandomLength = dataLength - (dateFormatLength + customIdLength)

	if (dateFormatLength+customIdLength > dataLength) || (dateFormatLength+customIdLength == dataLength) || (newRandomLength < randomLength) {
		return "", errors.New("没有满足条件")
	}
	return fmt.Sprintf("%v%s%s", customId, gotime.SetCurrentParse(setTime).SetFormat(dateFormat), gorandom.Numeric(newRandomLength)), nil
}

// 生成18位时间[年月]唯一编号
func generateIdFour(customId, setTime string) (string, error) {

	var (
		newRandomLength = 0             // 随机数据长度
		customIdLength  = len(customId) // 自定义长度
	)

	const (
		randomLength     = 5               // 随机数据长度
		dataLength       = 18              // 默认数据长度
		dateFormat       = "200601"        // 时间格式
		dateFormatLength = len(dateFormat) // 时间格式长度
	)

	// 重新计算随机数据长度
	newRandomLength = dataLength - (dateFormatLength + customIdLength)

	if (dateFormatLength+customIdLength > dataLength) || (dateFormatLength+customIdLength == dataLength) || (newRandomLength < randomLength) {
		return "", errors.New("没有满足条件")
	}
	return fmt.Sprintf("%v%s%s", customId, gotime.SetCurrentParse(setTime).SetFormat(dateFormat), gorandom.Numeric(newRandomLength)), nil
}

// 生成18位时间[年]唯一编号
func generateIdFive(customId, setTime string) (string, error) {

	var (
		newRandomLength = 0             // 随机数据长度
		customIdLength  = len(customId) // 自定义长度
	)

	const (
		randomLength     = 5               // 随机数据长度`
		dataLength       = 18              // 默认数据长度
		dateFormat       = "2006"          // 时间格式
		dateFormatLength = len(dateFormat) // 时间格式长度
	)

	// 重新计算随机数据长度
	newRandomLength = dataLength - (dateFormatLength + customIdLength)

	if (dateFormatLength+customIdLength > dataLength) || (dateFormatLength+customIdLength == dataLength) || (newRandomLength < randomLength) {
		return "", errors.New("没有满足条件")
	}
	return fmt.Sprintf("%v%s%s", customId, gotime.SetCurrentParse(setTime).SetFormat(dateFormat), gorandom.Numeric(newRandomLength)), nil
}

// 生成18位随机唯一编号
func generateIdSix(customId string) (string, error) {

	var (
		newRandomLength = 0             // 随机数据长度
		customIdLength  = len(customId) // 自定义长度
	)

	const (
		randomLength = 5  // 随机数据长度
		dataLength   = 18 // 默认数据长度
	)

	// 重新计算随机数据长度
	newRandomLength = dataLength - customIdLength

	if (customIdLength > dataLength) || (customIdLength == dataLength) || (newRandomLength < randomLength) {
		return "", errors.New("没有满足条件")
	}
	return fmt.Sprintf("%v%s", customId, gorandom.Numeric(newRandomLength)), nil
}
