package auditservice

import (
	"strconv"
	"time"

	httptransport "github.com/go-openapi/runtime/client"
	"github.com/go-openapi/strfmt"
	"github.com/samber/lo"
	"github.com/stretchr/testify/require"
	"github.com/stretchr/testify/suite"

	"github.com/tidbcloud/tidb-management-service/functional-test/pkg/auditservice/client"
	"github.com/tidbcloud/tidb-management-service/functional-test/pkg/auditservice/client/auditlog"
	"github.com/tidbcloud/tidb-management-service/functional-test/pkg/auditservice/model"
)

type Cli struct {
	*client.Rest

	su *suite.Suite
}

func NewClient(su *suite.Suite, host, bearerToken string) (*Cli, error) {
	trans := httptransport.New(host, "", []string{"https"})
	trans.DefaultAuthentication = httptransport.BearerToken(bearerToken)
	return &Cli{su: su, Rest: client.New(trans, strfmt.Default)}, nil
}

func (cli *Cli) SearchAuditLogs(orgID, clusterName, eventType string) []*model.TypesExportEvent {
	params := auditlog.NewGetAPIV1AuditOrgIDAuditLogsParams()
	orgIDd, err := strconv.ParseInt(orgID, 10, 64)
	require.NoError(cli.su.T(), err)
	params.OrgID = orgIDd
	params.Page = lo.ToPtr(int64(1))
	params.PerPage = lo.ToPtr(int64(10))
	params.Result = lo.ToPtr(int64(1))
	params.EndedAt = lo.ToPtr(time.Now().Unix())
	params.StartedAt = lo.ToPtr(time.Now().Unix() - 60) // 1 min ago
	params.EventTypes = lo.ToPtr(eventType)
	// FIXME: Currently, this filter is not valid, so we comment it out.
	// params.ClusterName = lo.ToPtr(clusterName)

	resp, err := cli.Auditlog.GetAPIV1AuditOrgIDAuditLogs(params)

	require.NoError(cli.su.T(), err)
	require.NotEmpty(cli.su.T(), resp.Payload.Events)

	return resp.Payload.Events
}
