package qx

import (
	"database/sql"
	"reflect"
	"strings"
)

type mysql struct {
}

// LIMIT в MySQL синтаксисе, поэтому ничего не меняем
func (s *mysql) AdaptLimitClause(query string) string {
	return query
}

func (s *mysql) ModifySelectQuery(parsedList []string, inArgs []interface{}) (query string, args []interface{}, err error) {
	// копируем список
	list := make([]string, len(parsedList))
	copy(list, parsedList)

	argIdx := 0
	for idx := 1; idx < len(list); idx += 2 {
		pos := list[idx]
		if pos == "" {
			// простой параметр '?'
			list[idx] = "?"
			args = append(args, inArgs[argIdx])
		} else {
			// Параметр из SQL 'IN' инструкции
			arg := inArgs[argIdx]
			// Проверяем аргумент - массив или нет
			params := reflect.ValueOf(arg)
			if params.Kind() != reflect.Slice {
				// простой параметр '?'
				list[idx] = "?"
				args = append(args, arg)
			} else {
				// параметр-массив
				placeholders := make([]string, params.Len())
				for i := 0; i < len(placeholders); i++ {
					placeholders[i] = "?"
					args = append(args, params.Index(i).Interface())
				}
				list[idx] = strings.Join(placeholders, ", ")
			}
		}
		argIdx++
	}
	// Склеиваем итоговый запрос
	query = strings.Join(list, "")
	return
}

func (s *mysql) JoinSelectQuery(parsedList []string) (query string) {
	// копируем список
	list := make([]string, len(parsedList))
	copy(list, parsedList)

	for idx := 1; idx < len(list); idx += 2 {
		// простой параметр '?'
		list[idx] = "?"
	}
	// Склеиваем итоговый запрос
	query = strings.Join(list, "")
	return
}

func (s *mysql) LastInsertId(tx *sql.Tx, res sql.Result, seq string) (id int64, err error) {
	return res.LastInsertId()
}
