// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.

package dbtest

import (
	"context"
	"testing"

	db "github.com/gitpod-io/gitpod/components/gitpod-db/go"
	"github.com/google/uuid"
	"github.com/stretchr/testify/require"
	"gorm.io/gorm"
)

func NewUsage(t *testing.T, record db.Usage) db.Usage {
	t.Helper()

	workspaceInstanceId := uuid.New()

	result := db.Usage{
		ID:                  uuid.New(),
		AttributionID:       db.NewUserAttributionID(uuid.New().String()),
		Description:         "some description",
		CreditCents:         42,
		EffectiveTime:       db.VarcharTime{},
		Kind:                db.WorkspaceInstanceUsageKind,
		WorkspaceInstanceID: &workspaceInstanceId,
	}

	if record.ID.ID() != 0 {
		result.ID = record.ID
	}
	if record.EffectiveTime.IsSet() {
		result.EffectiveTime = record.EffectiveTime
	}
	if record.AttributionID != "" {
		result.AttributionID = record.AttributionID
	}
	if record.Description != "" {
		result.Description = record.Description
	}
	if record.CreditCents != 0 {
		result.CreditCents = record.CreditCents
	}
	if record.WorkspaceInstanceID != nil && (*record.WorkspaceInstanceID).ID() != 0 {
		result.WorkspaceInstanceID = record.WorkspaceInstanceID
	}
	if record.Kind != "" {
		result.Kind = record.Kind
	}
	if record.Draft {
		result.Draft = true
	}
	if record.Metadata != nil {
		result.Metadata = record.Metadata
	}
	return result
}

func CreateUsageRecords(t *testing.T, conn *gorm.DB, entries ...db.Usage) []db.Usage {
	t.Helper()

	var records []db.Usage
	var ids []string
	for _, usageEntry := range entries {
		record := NewUsage(t, usageEntry)
		records = append(records, record)
		ids = append(ids, record.ID.String())
	}

	require.NoError(t, db.InsertUsage(context.Background(), conn, entries...))
	t.Cleanup(func() {
		if len(ids) > 0 {
			require.NoError(t, conn.Where(ids).Delete(&db.Usage{}).Error)
		}
	})

	return records
}
