package tests

import (
	"github.com/go-jet/jet"
	"github.com/go-jet/jet/tests/.gentestdata/jetdb/dvds/model"
	"github.com/google/uuid"
	"gotest.tools/assert"
	"strings"
	"testing"
	"time"
)

func assertStatementSql(t *testing.T, query jet.Statement, expectedQuery string, expectedArgs ...interface{}) {
	_, args, err := query.Sql()
	assert.NilError(t, err)
	//assert.Equal(t, queryStr, expectedQuery)
	assert.DeepEqual(t, args, expectedArgs)

	debuqSql, err := query.DebugSql()

	assert.NilError(t, err)
	assert.Equal(t, debuqSql, expectedQuery)
}

func assertExec(t *testing.T, stmt jet.Statement, rowsAffected int64) {
	res, err := stmt.Exec(db)

	assert.NilError(t, err)
	rows, err := res.RowsAffected()
	assert.NilError(t, err)
	assert.Equal(t, rows, rowsAffected)
}

func assertExecErr(t *testing.T, stmt jet.Statement, errorStr string) {
	_, err := stmt.Exec(db)

	assert.Error(t, err, errorStr)
}
func boolPtr(b bool) *bool {
	return &b
}

func int16Ptr(i int16) *int16 {
	return &i
}

func int32Ptr(i int32) *int32 {
	return &i
}

func int64Ptr(i int64) *int64 {
	return &i
}

func stringPtr(s string) *string {
	return &s
}

func byteArrayPtr(arr []byte) *[]byte {
	return &arr
}

func float32Ptr(f float32) *float32 {
	return &f
}
func float64Ptr(f float64) *float64 {
	return &f
}

func uuidPtr(u string) *uuid.UUID {
	newUUID := uuid.MustParse(u)

	return &newUUID
}

func timeWithoutTimeZone(t string) *time.Time {
	newTime, err := time.Parse("15:04:05", t)

	if err != nil {
		panic(err)
	}

	return &newTime
}

func timeWithTimeZone(t string) *time.Time {
	newTimez, err := time.Parse("15:04:05 -0700", t)

	if err != nil {
		panic(err)
	}

	return &newTimez
}

func timestampWithoutTimeZone(t string, precision int) *time.Time {

	precisionStr := ""

	if precision > 0 {
		precisionStr = "." + strings.Repeat("9", precision)
	}

	newTime, err := time.Parse("2006-01-02 15:04:05"+precisionStr+" +0000", t+" +0000")

	if err != nil {
		panic(err)
	}

	return &newTime
}

func timestampWithTimeZone(t string, precision int) *time.Time {

	precisionStr := ""

	if precision > 0 {
		precisionStr = "." + strings.Repeat("9", precision)
	}

	newTime, err := time.Parse("2006-01-02 15:04:05"+precisionStr+" -0700 MST", t)

	if err != nil {
		panic(err)
	}

	return &newTime
}

var customer0 = model.Customer{
	CustomerID: 1,
	StoreID:    1,
	FirstName:  "Mary",
	LastName:   "Smith",
	Email:      stringPtr("mary.smith@sakilacustomer.org"),
	AddressID:  5,
	Activebool: true,
	CreateDate: *timestampWithoutTimeZone("2006-02-14 00:00:00", 0),
	LastUpdate: timestampWithoutTimeZone("2013-05-26 14:49:45.738", 3),
	Active:     int32Ptr(1),
}

var customer1 = model.Customer{
	CustomerID: 2,
	StoreID:    1,
	FirstName:  "Patricia",
	LastName:   "Johnson",
	Email:      stringPtr("patricia.johnson@sakilacustomer.org"),
	AddressID:  6,
	Activebool: true,
	CreateDate: *timestampWithoutTimeZone("2006-02-14 00:00:00", 0),
	LastUpdate: timestampWithoutTimeZone("2013-05-26 14:49:45.738", 3),
	Active:     int32Ptr(1),
}

var lastCustomer = model.Customer{
	CustomerID: 599,
	StoreID:    2,
	FirstName:  "Austin",
	LastName:   "Cintron",
	Email:      stringPtr("austin.cintron@sakilacustomer.org"),
	AddressID:  605,
	Activebool: true,
	CreateDate: *timestampWithoutTimeZone("2006-02-14 00:00:00", 0),
	LastUpdate: timestampWithoutTimeZone("2013-05-26 14:49:45.738", 3),
	Active:     int32Ptr(1),
}
