package builder

import (
	"html"

	"golang-fave/engine/wrapper"
)

const (
	DFKHidden = iota
	DFKText
	DFKEmail
	DFKPassword
	DFKTextArea
	DFKCheckBox
	DFKSubmit
	DFKMessage
)

type DataFormField struct {
	Caption     string
	Kind        int
	Name        string
	Value       string
	Placeholder string
	Hint        string
	Target      string
	Required    bool
	CallBack    func(field *DataFormField) string
}

func DataForm(wrap *wrapper.Wrapper, data []DataFormField) string {
	result := `<form class="data-form" action="/cp/" method="post" autocomplete="off">`
	result += `<div class="hidden">`
	for _, field := range data {
		if field.Kind == DFKHidden {
			if field.CallBack != nil {
				result += field.CallBack(&field)
			} else {
				result += `<input type="hidden" name="` + field.Name + `" value="` + html.EscapeString(field.Value) + `">`
			}
		}
	}
	result += `</div>`
	for _, field := range data {
		if field.Kind != DFKHidden && field.Kind != DFKSubmit && field.Kind != DFKMessage {
			if field.CallBack != nil {
				result += field.CallBack(&field)
			} else {
				required := ``
				if field.Required {
					required = ` required`
				}
				result += `<div class="form-group">`
				result += `<div class="row">`
				result += `<div class="col-3">`

				if field.Kind != DFKCheckBox {
					result += `<label for="lbl_` + field.Name + `">` + field.Caption + `</label>`
				} else {
					result += `<label>` + field.Caption + `</label>`
				}

				result += `</div>`
				result += `<div class="col-9">`
				result += `<div>`
				if field.Kind == DFKText {
					result += `<input class="form-control" type="text" id="lbl_` + field.Name + `" name="` + field.Name + `" value="` + html.EscapeString(field.Value) + `" placeholder="` + field.Placeholder + `" autocomplete="off"` + required + `>`
				} else if field.Kind == DFKEmail {
					result += `<input class="form-control" type="email" id="lbl_` + field.Name + `" name="` + field.Name + `" value="` + html.EscapeString(field.Value) + `" placeholder="` + field.Placeholder + `" autocomplete="off"` + required + `>`
				} else if field.Kind == DFKPassword {
					result += `<input class="form-control" type="password" id="lbl_` + field.Name + `" name="` + field.Name + `" value="` + html.EscapeString(field.Value) + `" placeholder="` + field.Placeholder + `" autocomplete="off"` + required + `>`
				} else if field.Kind == DFKTextArea {
					result += `<textarea class="form-control" id="lbl_` + field.Name + `" name="` + field.Name + `" placeholder="` + field.Placeholder + `" autocomplete="off"` + required + `>` + html.EscapeString(field.Value) + `</textarea>`
				} else if field.Kind == DFKCheckBox {
					checked := ""
					if field.Value != "0" {
						checked = " checked"
					}
					result += `<div class="checkbox-ios"><input class="form-control" type="checkbox" id="lbl_` + field.Name + `" name="` + field.Name + `" value="1"` + `" autocomplete="off"` + required + checked + `><label for="lbl_` + field.Name + `"></label></div>`
				}
				result += `</div>`
				if field.Hint != "" {
					result += `<div><small>` + field.Hint + `</small></div>`
				}
				result += `</div>`
				result += `</div>`
				result += `</div>`
			}
		}
	}

	// TODO: optimize this...

	for _, field := range data {
		if field.Kind == DFKMessage {
			if field.CallBack != nil {
				result += field.CallBack(&field)
			} else {
				result += `<div class="row">`
				result += `<div class="col-3">`
				result += `</div>`
				result += `<div class="col-9">`
				result += `<div class="sys-messages"></div>`
				result += `</div>`
				result += `</div>`
			}
		}
	}

	for _, field := range data {
		if field.Kind == DFKSubmit {
			if field.CallBack != nil {
				result += field.CallBack(&field)
			} else {
				result += `<div class="row hidden">`
				result += `<div class="col-3">`
				result += `&nbsp;`
				result += `</div>`
				result += `<div class="col-9">`
				result += `<button type="submit" class="btn btn-primary" data-target="` + field.Target + `">` + html.EscapeString(field.Value) + `</button>`
				result += `</div>`
				result += `</div>`
			}
		}
	}
	result += `</form>`
	return result
}