package org.shunt.common;

import cn.hutool.core.util.ObjectUtil;

import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Objects;


public final class XmoseAssert {
	
	public static void assertNotNull(Object param, String msg) {
		if(null == param) {
			unsupportedNotice(msg);
		}
	}
	
	public static void assertNotEmpty(Object param,String msg) {
		if(Objects.isNull(param)) {
			unsupportedNotice(msg);
		}
		if(param instanceof Collection<?> && ((Collection<?>) param).size() == 0) {
			unsupportedNotice(msg);
		}
	}
	
	public static void assertTrue(Boolean param,String msg) {
		if(!param) {
			unsupportedNotice(msg);
		}
	}
	public static void assertFalse(Boolean param,String msg) {
		if(param) {
			unsupportedNotice(msg);
		}
	}
	public static void assertNumber(Object param,String msg) {
		try {
			Double.valueOf(param.toString());
		}catch (Exception ex) {
			unsupportedNotice(msg);
		}
	}
	public static <T> void assertRang(T param,Collection<T> rang,String msg) {
		if(!rang.contains(param)) {
			unsupportedNotice(msg);
		}
	}
	
	public static void assertDate(Object param,String msg) {
		try {
			new SimpleDateFormat("yyyy-MM-dd").parse(param.toString());
		}catch (Exception ex) {
			unsupportedNotice(msg);
		}
	}
	public static void assertTimestamp(Object param,String msg) {
		try {
			new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(param.toString());
		}catch (Exception ex) {
			unsupportedNotice(msg);
		}
	}
	public static void assertTargetStatus(Integer param, Integer targetStatus, String msg) {
		if (ObjectUtil.isEmpty(param) || 
			ObjectUtil.isEmpty(targetStatus) || 
			param.intValue() != targetStatus.intValue()) {
			configNotice(msg);
		}
	}
	
	public static void forbiddenNotice(String msg) {
		throw new XmoseForbiddenException(msg);
	}
	public static void unauthorizedNotice(String msg) {
		throw new XmoseUnauthorizedException(msg);
	}
	public static void unsupportedNotice(String msg) {
		throw new XmoseUnsupportedException(msg);
	}
	public static void configNotice(String msg) {
		throw new XmoseConfigException(msg);
	}
	public static void internelNotice(String msg) {
		throw new XmoseInternelException(msg);
	}

}
