package httpgateway

import (
	"fmt"

	"github.com/tidbcloud/pkgv2/bizerr"
	"go.uber.org/zap"
)

type ExecuteRequest struct {
	Query string `form:"query" json:"query"`
}

type ExecuteResponse struct {
	Types        []*FieldType `json:"types,omitempty"`
	Rows         [][]*string  `json:"rows,omitempty"`
	RowsAffected *int64       `json:"rowsAffected,omitempty"`
	// LastInsertID deprecated, is only used by serverless-js <= v0.1.1.
	LastInsertID *int64 `json:"lastInsertID,omitempty"`
	// SLastInsertID https://developer.mozilla.org/en-US/docs/Web/API/Response/json
	// Javascript json() function will lose precision for int64, so we need to return it as string.
	SLastInsertID *string `json:"sLastInsertID,omitempty"`
}

type FieldType struct {
	Name     string `json:"name"`
	Type     string `json:"type"`
	Nullable bool   `json:"nullable"`
}

type ErrorResp struct {
	Code    int64  `json:"code"`
	Message string `json:"message"`
}

func NewErrorResp(code int64, message string) *ErrorResp {
	return &ErrorResp{
		Code:    code,
		Message: message,
	}
}

func BizErrorToErrorResp(err bizerr.BizError) *ErrorResp {
	if bizerr.IsInternalErr(err.ErrCode()) {
		return &ErrorResp{
			Code:    int64(err.ErrCode()),
			Message: UnknownInternalErrorMessage,
		}
	}
	return &ErrorResp{
		Code:    int64(err.ErrCode()),
		Message: err.ErrMsg(),
	}
}

type MysqlLogger struct {
	logger *zap.Logger
}

func (m *MysqlLogger) Print(v ...interface{}) {
	m.logger.Error(fmt.Sprint(v...), zap.String("source", "go-sql-driver"))
}

type SqlType string

const (
	Query    SqlType = "query"
	DML      SqlType = "dml"
	Begin    SqlType = "begin"
	Commit   SqlType = "commit"
	Rollback SqlType = "rollback"
	// Execute contains set, ddl, use, create user, grant, savepoint, release savepoint, rollback savepoint
	Execute     SqlType = "execute"
	Unsupported SqlType = "unsupported"
	Undefined   SqlType = "undefined"
)

type Credential struct {
	Username string
	Password string
	Database string
}
