package sqlbuilder

import (
	"fmt"
	"strings"
)

type Cond string

func Equal[T any](field string, value T) Cond {
	return Cond(fmt.Sprintf("%s = '%v'", field, value))
}

func NotEqual[T any](field string, value T) Cond {
	return Cond(fmt.Sprintf("%s != '%v'", field, value))
}

func In[T any](field string, values []T) Cond {
	args := make([]string, len(values))
	for i, v := range values {
		args[i] = fmt.Sprintf("'%v'", v)
	}

	return Cond(fmt.Sprintf("%s IN (%s)", field, strings.Join(args, ", ")))
}

func NotIn[T any](field string, values []T) Cond {
	args := make([]string, len(values))
	for i, v := range values {
		args[i] = fmt.Sprintf("'%v'", v)
	}

	return Cond(fmt.Sprintf("%s NOT IN (%s)", field, strings.Join(args, ", ")))
}

func Like[T any](field string, value T) Cond {
	return Cond(fmt.Sprintf("%s LIKE '%v'", field, value))
}

func Raw(expr string) Cond {
	return Cond(expr)
}

func And(conds ...Cond) Cond {
	condStrs := make([]string, len(conds))
	for i, c := range conds {
		condStrs[i] = "(" + string(c) + ")"
	}

	return Cond(strings.Join(condStrs, " AND "))
}
