package schema

import (
	
	

	
)

// reg match english letters and midline
var regEnLetterAndMidline = regexp.MustCompile(`^[\w-]+$`)

type CheckConstraint struct {
	Name       string
	Constraint string // length(phone) >= 10
	*Field
}

func ( *CheckConstraint) () string { return .Name }

func ( *CheckConstraint) () ( string,  []interface{}) {
	return "CONSTRAINT ? CHECK (?)", []interface{}{clause.Column{Name: .Name}, clause.Expr{SQL: .Constraint}}
}

// ParseCheckConstraints parse schema check constraints
func ( *Schema) () map[string]CheckConstraint {
	 := map[string]CheckConstraint{}
	for ,  := range .FieldsByDBName {
		if  := .TagSettings["CHECK"];  != "" {
			 := strings.Split(, ",")
			if len() > 1 && regEnLetterAndMidline.MatchString([0]) {
				[[0]] = CheckConstraint{Name: [0], Constraint: strings.Join([1:], ","), Field: }
			} else {
				if [0] == "" {
					 = strings.Join([1:], ",")
				}
				 := .namer.CheckerName(.Table, .DBName)
				[] = CheckConstraint{Name: , Constraint: , Field: }
			}
		}
	}
	return 
}

type UniqueConstraint struct {
	Name  string
	Field *Field
}

func ( *UniqueConstraint) () string { return .Name }

func ( *UniqueConstraint) () ( string,  []interface{}) {
	return "CONSTRAINT ? UNIQUE (?)", []interface{}{clause.Column{Name: .Name}, clause.Column{Name: .Field.DBName}}
}

// ParseUniqueConstraints parse schema unique constraints
func ( *Schema) () map[string]UniqueConstraint {
	 := make(map[string]UniqueConstraint)
	for ,  := range .Fields {
		if .Unique {
			 := .namer.UniqueName(.Table, .DBName)
			[] = UniqueConstraint{Name: , Field: }
		}
	}
	return 
}