import re
from datetime import datetime

# Validate the input value based on the attribute's constraints
def validate_value(attrib, input_val):
    # Check if the value is required
    if attrib.required and not input_val:
        return f"{attrib.display_name} is required."

    # Validate based on input type
    if attrib.html_input_type == "number":
        try:
            input_val = int(input_val)
        except ValueError:
            return f"{attrib.display_name} must be a valid number."

        if attrib.min is not None and input_val < attrib.min:
            return f"{attrib.display_name} must be at least {attrib.min}."
        if attrib.max is not None and input_val > attrib.max:
            return f"{attrib.display_name} must be at most {attrib.max}."
    elif attrib.html_input_type == "date":
        try:
            input_val = datetime.strptime(input_val, "%Y-%m-%d")  # Validate date format
        except ValueError:
            return f"{attrib.display_name} must be a valid date in YYYY-MM-DD format."

        if attrib.min is not None and input_val < datetime.strptime(attrib.min, "%Y-%m-%d"):
            return f"{attrib.display_name} must be on or after {attrib.min}."
        if attrib.max is not None and input_val > datetime.strptime(attrib.max, "%Y-%m-%d"):
            return f"{attrib.display_name} must be on or before {attrib.max}."
    elif attrib.html_input_type == "select":
        if input_val not in attrib.options:
            return f"{attrib.display_name} must be one of {attrib.options}."
    elif attrib.html_input_type == "text":
        if attrib.regex and not re.match(attrib.regex, input_val):
            return f"{attrib.display_name} is invalid. Allowed pattern: {attrib.regex}."

    # Validate comparison
    #if attrib.compareto:
        # compare attrib value
		#return ""

    # If all checks pass, return "Ok"
    return "Ok"