package workload

import (
	"context"
	"fmt"

	"github.com/tidbcloud/pov-service/internal/common/errors"
	"github.com/tidbcloud/pov-service/internal/common/params"
	"github.com/tidbcloud/pov-service/internal/model"
)

func (s *svcImpl) ListWorkloads(_ context.Context, param params.ListWorkloads) ([]model.Workload, error) {
	wls, err := s.Workload.ListWorkloads(param)
	if err != nil {
		return nil, err
	}

	return wls, nil
}

func (s *svcImpl) GetWorkloadUsage(
	ctx context.Context) (map[int64]int, error) {
	return s.workloadTestRepo.Count(ctx)
}

func (s *svcImpl) GetWorkload(ctx context.Context, id int64) (model.Workload, error) {
	// TODO: list from repo
	allWls, err := s.ListWorkloads(ctx, params.ListWorkloads{})
	if err != nil {
		return model.Workload{}, err
	}
	for _, wl := range allWls {
		if wl.ID == id {
			return wl, nil
		}
	}
	return model.Workload{}, errors.NewNotFound(fmt.Sprintf("workload %d not found", id))
}

func (s *svcImpl) GetPreservedSampleDBs(
	ctx context.Context,
	workloadID int64) (model.DBSampleResult, error) {
	legacySample, err := s.workloadSampleRepo.SelectLatestSchema(ctx, workloadID)
	if err != nil {
		return model.DBSampleResult{}, err
	}
	if legacySample.DBCount == 0 {
		return model.DBSampleResult{}, errors.NewInvalidArgument("preserved workload sample not found")
	}
	return legacySample, nil
}

// TODO: Get Data with version, there will be possibility that the table has been changed
// in the meantime
func (s *svcImpl) GetPreservedSampleData(
	ctx context.Context,
	workloadID int64,
	dbName, tableName string,
) (model.TableQueryResult, error) {
	legacySample, err := s.workloadSampleRepo.SelectTable(ctx, workloadID, dbName, tableName)
	if err != nil {
		if _, ok := err.(errors.NotFound); ok {
			return model.TableQueryResult{}, errors.NewInvalidArgument("preserved workload table sample not found")
		}
		return model.TableQueryResult{}, err
	}

	return model.TableQueryResult{
		Table:    legacySample,
		RowCount: len(legacySample.Rows),
	}, nil
}
