package squirrel

import (
	
	

	
)

func () {
	builder.Register(CaseBuilder{}, caseData{})
}
sqlizerBuffer is a helper that allows to write many Sqlizers one by one without constant checks for errors that may come from Sqlizer
type sqlizerBuffer struct {
	bytes.Buffer
	args []interface{}
	err  error
}
WriteSql converts Sqlizer to SQL strings and writes it to buffer
func ( *sqlizerBuffer) ( Sqlizer) {
	if .err != nil {
		return
	}

	var  string
	var  []interface{}
	, , .err = .ToSql()

	if .err != nil {
		return
	}

	.WriteString()
	.WriteByte(' ')
	.args = append(.args, ...)
}

func ( *sqlizerBuffer) () (string, []interface{}, error) {
	return .String(), .args, .err
}
whenPart is a helper structure to describe SQLs "WHEN ... THEN ..." expression
type whenPart struct {
	when Sqlizer
	then Sqlizer
}

func ( interface{},  interface{}) whenPart {
	return whenPart{newPart(), newPart()}
}
caseData holds all the data required to build a CASE SQL construct
ToSql implements Sqlizer
func ( *caseData) () ( string,  []interface{},  error) {
	if len(.WhenParts) == 0 {
		 = errors.New("case expression must contain at lease one WHEN clause")

		return
	}

	 := sqlizerBuffer{}

	.WriteString("CASE ")
	if .What != nil {
		.WriteSql(.What)
	}

	for ,  := range .WhenParts {
		.WriteString("WHEN ")
		.WriteSql(.when)
		.WriteString("THEN ")
		.WriteSql(.then)
	}

	if .Else != nil {
		.WriteString("ELSE ")
		.WriteSql(.Else)
	}

	.WriteString("END")

	return .ToSql()
}
CaseBuilder builds SQL CASE construct which could be used as parts of queries.
ToSql builds the query into a SQL string and bound args.
func ( CaseBuilder) () (string, []interface{}, error) {
	 := builder.GetStruct().(caseData)
	return .ToSql()
}
what sets optional value for CASE construct "CASE [value] ..."
func ( CaseBuilder) ( interface{}) CaseBuilder {
	return builder.Set(, "What", newPart()).(CaseBuilder)
}
When adds "WHEN ... THEN ..." part to CASE construct
TODO: performance hint: replace slice of WhenPart with just slice of parts where even indices of the slice belong to "when"s and odd indices belong to "then"s
	return builder.Append(, "WhenParts", newWhenPart(, )).(CaseBuilder)
}
What sets optional "ELSE ..." part for CASE construct
func ( CaseBuilder) ( interface{}) CaseBuilder {
	return builder.Set(, "Else", newPart()).(CaseBuilder)