package pimport

import (
	"context"
	"testing"

	"github.com/stretchr/testify/suite"
	"github.com/tidbcloud/dataflow-service/internal/db/entity"
	pimport "github.com/tidbcloud/dataflow-service/internal/model/import"
	"github.com/tidbcloud/idl/pbgen/proto/openapi/dp"
	plog "github.com/tidbcloud/pkgv2/log"
)

type testConversionSuite struct {
	suite.Suite
}

func TestConversionSuite(t *testing.T) {
	suite.Run(t, &testConversionSuite{})
}

func (s *testConversionSuite) TestImportSpecToEntityForLocalFileImport() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()
	imp, err := ImportSpec2Entity(
		ctx,
		&dp.ImportSpec{
			Source: &dp.ImportSource{
				Type: dp.ImportSource_LOCAL_FILE,
				Uri:  "file://123/",
				Format: &dp.ImportSourceFormat{
					Type: dp.ImportSourceFormat_CSV,
				},
			},
			Target: &dp.ImportTarget{
				Tables: []*dp.ImportTargetTable{
					{
						DatabaseName: "testdb",
						TableName:    "testtbl",
					},
				},
			},
		},
		&entity.ImportUploadStub{
			LocalFileName:    "foobar_local.csv",
			UploadedFileName: "foobar_remote.csv",
			UploadedURL:      "s3://some_bucket/foo/bar",
			UploadedRegion:   "us-west-2",
		},
		plog.WithContextL(ctx),
	)
	s.Require().NoError(err)
	s.Require().Equal(entity.ImportDataSourceS3, imp.DataSourceType)
	s.Require().Equal(entity.ImportDataFormatCsv, imp.DataFormat)
	s.Require().Equal("s3://some_bucket/foo/bar", imp.SourceURL)
	s.Require().Equal("us-west-2", imp.BucketRegion)
	s.Require().Equal(
		&entity.LocalImportCfg{
			FileName:         "foobar_remote.csv",
			TargetDb:         "testdb",
			TargetTable:      "testtbl",
			OriginalFileName: "foobar_local.csv",
		},
		imp.LocalImportCfg,
	)
}

func (s *testConversionSuite) TestTweakImportEntityForCreate() {
	imp := &pimport.ImportTask{
		Import: entity.Import{
			SourceURL: "s3://some_bucket/foo/bar",
			LocalImportCfg: &entity.LocalImportCfg{
				FileName:         "foobar_remote.csv",
				TargetDb:         "testdb",
				TargetTable:      "testtbl",
				OriginalFileName: "foobar_local.csv",
			},
		},
	}
	err := tweakImportEntityForCreate(imp)
	s.Require().NoError(err)
	s.Require().Equal("s3://some_bucket/foo/bar/foobar_remote.csv", imp.SourceURL)
}
