package http

import (
	"context"

	dto "dataservices/internal/dto/dataapi_gateway"
)

func CreateSession(ctx context.Context, region string, req *dto.CreateSessionReq) (resp *dto.CreateSessionResp, e error) {
	return CreateSessionWithProvider(ctx, region, "", req)
}

func CreateSessionWithProvider(ctx context.Context, region, provider string, req *dto.CreateSessionReq) (resp *dto.CreateSessionResp, e error) {
	url := "/inner/dataservice/session/create"
	resp = &dto.CreateSessionResp{}
	e = postToDataappGateway(ctx, region, provider, url, req, resp)
	return
}

func CloseSession(ctx context.Context, region string, req *dto.CloseSessionReq) error {
	return CloseSessionWithProvider(ctx, region, "", req)
}

func CloseSessionWithProvider(ctx context.Context, region, provider string, req *dto.CloseSessionReq) error {
	url := "/inner/dataservice/session/close"
	resp := &dto.CloseSessionResp{}
	return postToDataappGateway(ctx, region, provider, url, req, resp)
}

func TestEndpointV2(ctx context.Context, region string, req *dto.TestEndpointReqV2) (resp *dto.ExecSqlResp, e error) {
	return TestEndpointV2WithProvider(ctx, region, "", req)
}

func TestEndpointV2WithProvider(ctx context.Context, region, provider string, req *dto.TestEndpointReqV2) (resp *dto.ExecSqlResp, e error) {
	url := "/inner/dataservice/v2/endpoint/test"
	resp = &dto.ExecSqlResp{}
	e = postToDataappGateway(ctx, region, provider, url, req, resp)
	return
}

func ExecSqlTemplateV2(ctx context.Context, region string, req *dto.ExecSqlTemplateReqV2) (resp *dto.ExecSqlResp, e error) {
	return ExecSqlTemplateV2WithProvider(ctx, region, "", req)
}

func ExecSqlTemplateV2WithProvider(ctx context.Context, region, provider string, req *dto.ExecSqlTemplateReqV2) (resp *dto.ExecSqlResp, e error) {
	url := "/inner/dataservice/v2/exec/sqltemplate"
	resp = &dto.ExecSqlResp{}
	e = postToDataappGateway(ctx, region, provider, url, req, resp)
	return
}

func ExecSql(ctx context.Context, region string, req *dto.ExecSqlReq) (resp *dto.ExecSqlResp, e error) {
	return ExecSqlWithProvider(ctx, region, "", req)
}

func ExecSqlWithProvider(ctx context.Context, region, provider string, req *dto.ExecSqlReq) (resp *dto.ExecSqlResp, e error) {
	url := "/inner/dataservice/exec/sql"
	resp = &dto.ExecSqlResp{}
	e = postToDataappGateway(ctx, region, provider, url, req, resp)
	return
}

func GetDatabaseMeta(ctx context.Context, region string, req *dto.GetDatabaseMetaReq) (resp *dto.GetDatabaseMetaResp, e error) {
	return GetDatabaseMetaWithProvider(ctx, region, "", req)
}

func GetDatabaseMetaWithProvider(ctx context.Context, region, provider string, req *dto.GetDatabaseMetaReq) (resp *dto.GetDatabaseMetaResp, e error) {
	url := "/inner/dataservice/database/meta"
	resp = &dto.GetDatabaseMetaResp{}
	e = postToDataappGateway(ctx, region, provider, url, req, resp)
	return
}

func ResolveHost(ctx context.Context, region string, host string) (resp *dto.ResolveHostResp, e error) {
	return ResolveHostWithProvider(ctx, region, "", host)
}

func ResolveHostWithProvider(ctx context.Context, region, provider, host string) (resp *dto.ResolveHostResp, e error) {
	url := "/inner/dataservice/v2/resolvehost?host=" + host
	resp = &dto.ResolveHostResp{}
	e = postToDataappGateway(ctx, region, provider, url, nil, resp)
	return
}

func postToDataappGateway(ctx context.Context, region, provider, url string, req interface{}, resp interface{}) (err error) {
	defer func() {
		recordHttpCounterMetric("dataservice-dataapp-gateway", err)
	}()
	return postRequestToProviderO11yRegion(ctx, "dataservice-dataapp-gateway", region, provider, url, req, resp)
}
