package com.jsowell.common.util.id;

import com.google.common.collect.Sets;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.RandomUtil;

import java.util.Set;

/**
 * ID生成器工具类
 *
 * @author jsowell
 */
public class IdUtils {
	/**
	 * 获取随机UUID
	 *
	 * @return 随机UUID
	 */
	public static String randomUUID() {
		return UUID.randomUUID().toString();
	}

	/**
	 * 简化的UUID，去掉了横线
	 *
	 * @return 简化的UUID，去掉了横线
	 */
	public static String simpleUUID() {
		return UUID.randomUUID().toString(true);
	}

	/**
	 * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
	 *
	 * @return 随机UUID
	 */
	public static String fastUUID() {
		return UUID.fastUUID().toString();
	}

	/**
	 * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
	 *
	 * @return 简化的UUID，去掉了横线
	 */
	public static String fastSimpleUUID() {
		return UUID.fastUUID().toString(true);
	}

	/**
	 * 生成交易流水号
	 * @param pileSn        桩编号 例如：32010600019236
	 * @param connectorCode 枪口号 例如：01
	 */
	public static String generateTransactionCode(String pileSn, String connectorCode) {
		return generateTransactionCode(pileSn + connectorCode);
	}

	/**
	 * 生成交易流水号
	 * 生成规则为 格式桩号（7bytes） +枪号（1byte） +年月日时分秒（6bytes） +自 增序号（2bytes）；
	 * @param pileConnectorCode 为已经拼好的充电桩枪口号 例如：3201060001923601
	 * @return 交易流水号 例如：32010600019236012001061803423060 88000000000001012211301501294274
	 */
	public static String generateTransactionCode(String pileConnectorCode) {
		String timeNow = DateUtils.dateTimeNow(DateUtils.YYMMDDHHMMSS);
		//随机生成一个四位整数
		String randomNumber = RandomUtil.getRandomNumber(4);
		return pileConnectorCode + timeNow + randomNumber;
	}

	public static void main(String[] args) {
		Set<String> set = Sets.newHashSet();
		for (int i = 0; i < 1000000; i++) {
			String id = getOrderCode();
			set.add(id);
			System.out.println(id);
		}
		System.out.println("set size = " + set.size());
	}

	/**
	 * 生成12位orderCode
	 */
	public static String getOrderCode() {
		long id = Long.parseLong(SnowflakeIdWorker.getSnowflakeId());
		StringBuilder sb = new StringBuilder(id + "");
		StringBuilder reverse = sb.reverse();//将id翻转：我们发现id很长，且高位很长部分是一样的数
		id = new Long(reverse.toString()) / 1000;//切去部分长度
		while (id > 100000000000L) {
			id /= 10;
		}
		// Integer num = Integer.parseInt(id + "");
		return "C" + id;
	}

	/**
	 * 生成八位会员id
	 */
	public static String getMemberId() {
		long id = Long.parseLong(SnowflakeIdWorker.getSnowflakeId());
		StringBuilder sb = new StringBuilder(id + "");
		StringBuilder reverse = sb.reverse();//将id翻转：我们发现id很长，且高位很长部分是一样的数
		id = new Long(reverse.toString()) / 1000;//切去部分长度
		while (id > 100000000) {
			id /= 10;
		}
		Integer num = Integer.parseInt(id + "");
		return String.valueOf(num);
	}


}
