package test

import (
	"context"
	"testing"
	"time"

	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/config"
	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/dto"
	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/service"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

// TestDataProxyQueryWithDataSourceInOptions 测试 dataSource 在 options 中（标准格式）
func TestDataProxyQueryWithDataSourceInOptions(t *testing.T) {
	const dataSource = "s3://o11y-prod-shared-us-east-1/deltalake/1372813089209061633/019b6fc2-d5db-7527-8497-3572ae6285d4/slowlogs"

	cfg, err := config.LoadDataProxyConfig("../configs/config-dataproxy.yaml")
	require.NoError(t, err)

	svc, err := service.NewDataProxyService(cfg)
	require.NoError(t, err)

	req := &dto.DataProxyQueryRequest{
		SQL:       `SELECT count(*) FROM "clinic_data_proxy"."slow_query_logs" WHERE "date" = '20251230'`,
		ClusterId: "10754652599988043412",
		Timeout:   5 * time.Minute,
		Options: dto.DataProxyQueryOptions{
			DataSource: dataSource,
			Region:     "us-east-1",
		},
	}

	ctx := context.Background()
	result, err := svc.Query(ctx, req)

	require.NoError(t, err, "查询应该成功")
	assert.NotNil(t, result)
	assert.Greater(t, len(result.Rows), 0, "应该返回数据")
	assert.Equal(t, "athena", result.Metadata.Engine)
	assert.Equal(t, "aws", result.Metadata.Vendor)
	assert.Equal(t, "us-east-1", result.Metadata.Region)

	t.Logf("✅ 查询成功: RowCount=%d, QueryID=%s", result.Metadata.RowCount, result.Metadata.QueryID)
}

// TestDataProxyQueryWithAutoRegionDetection 测试只提供 dataSource，自动推断 region
func TestDataProxyQueryWithAutoRegionDetection(t *testing.T) {
	const dataSource = "s3://o11y-prod-shared-us-east-1/deltalake/1372813089209061633/019b6fc2-d5db-7527-8497-3572ae6285d4/slowlogs"

	cfg, err := config.LoadDataProxyConfig("../configs/config-dataproxy.yaml")
	require.NoError(t, err)

	svc, err := service.NewDataProxyService(cfg)
	require.NoError(t, err)

	req := &dto.DataProxyQueryRequest{
		SQL:       `SELECT count(*) FROM "clinic_data_proxy"."slow_query_logs" WHERE "date" = '20251230'`,
		ClusterId: "10754652599988043412",
		Timeout:   5 * time.Minute,
		Options: dto.DataProxyQueryOptions{
			DataSource: dataSource,
			// Region 未指定，应该自动从 S3 路径推断为 us-east-1
		},
	}

	ctx := context.Background()
	result, err := svc.Query(ctx, req)

	require.NoError(t, err, "查询应该成功（自动推断 region）")
	assert.NotNil(t, result)
	assert.Equal(t, "us-east-1", result.Metadata.Region, "应该自动推断出 us-east-1")

	t.Logf("✅ 自动推断 region 成功: %s", result.Metadata.Region)
}

// TestDataProxyQueryWithNonStandardTable 测试查询非标准表（应该被拒绝）
func TestDataProxyQueryWithNonStandardTable(t *testing.T) {
	const dataSource = "s3://o11y-prod-shared-us-east-1/deltalake/1372813089209061633/019b6fc2-d5db-7527-8497-3572ae6285d4/slowlogs"

	cfg, err := config.LoadDataProxyConfig("../configs/config-dataproxy.yaml")
	require.NoError(t, err)

	svc, err := service.NewDataProxyService(cfg)
	require.NoError(t, err)

	// 测试带 clusterId 后缀的表名（不再支持）
	req := &dto.DataProxyQueryRequest{
		SQL:       `SELECT count(*) FROM "clinic_data_proxy"."slow_query_logs_10754652599988043412" WHERE "date" = '20251230'`,
		ClusterId: "10754652599988043412",
		Timeout:   5 * time.Minute,
		Options: dto.DataProxyQueryOptions{
			DataSource: dataSource,
			Region:     "us-east-1",
		},
	}

	ctx := context.Background()
	result, err := svc.Query(ctx, req)

	assert.Error(t, err, "应该返回错误")
	assert.Nil(t, result)
	assert.Contains(t, err.Error(), "unsupported table", "错误信息应该包含 'unsupported table'")

	t.Logf("✅ 非标准表正确被拒绝: %v", err)
}

// TestDataProxyQueryWithoutDatePartitionFilter 测试缺少 date 分区过滤条件（应该被拒绝）
func TestDataProxyQueryWithoutDatePartitionFilter(t *testing.T) {
	const dataSource = "s3://o11y-prod-shared-us-east-1/deltalake/1372813089209061633/019b6fc2-d5db-7527-8497-3572ae6285d4/slowlogs"

	cfg, err := config.LoadDataProxyConfig("../configs/config-dataproxy.yaml")
	require.NoError(t, err)

	svc, err := service.NewDataProxyService(cfg)
	require.NoError(t, err)

	// SQL 没有 WHERE "date" = ... 条件
	req := &dto.DataProxyQueryRequest{
		SQL:       `SELECT count(*) FROM "clinic_data_proxy"."slow_query_logs"`,
		ClusterId: "10754652599988043412",
		Timeout:   5 * time.Minute,
		Options: dto.DataProxyQueryOptions{
			DataSource: dataSource,
			Region:     "us-east-1",
		},
	}

	ctx := context.Background()
	result, err := svc.Query(ctx, req)

	assert.Error(t, err, "应该返回错误")
	assert.Nil(t, result)
	assert.Contains(t, err.Error(), "missing partition filter", "错误信息应该包含 'missing partition filter'")

	t.Logf("✅ 缺少分区过滤条件正确被拒绝: %v", err)
}

// TestDataProxyQueryWithMissingDataSource 测试缺少 dataSource（应该被拒绝）
func TestDataProxyQueryWithMissingDataSource(t *testing.T) {
	cfg, err := config.LoadDataProxyConfig("../configs/config-dataproxy.yaml")
	require.NoError(t, err)

	svc, err := service.NewDataProxyService(cfg)
	require.NoError(t, err)

	// 既没有提供 dataSource，也没有提供有效的 clusterId
	req := &dto.DataProxyQueryRequest{
		SQL:       `SELECT count(*) FROM "clinic_data_proxy"."slow_query_logs" WHERE "date" = '20251230'`,
		ClusterId: "invalid_cluster",
		Timeout:   5 * time.Minute,
		Options:   dto.DataProxyQueryOptions{},
	}

	ctx := context.Background()
	result, err := svc.Query(ctx, req)

	assert.Error(t, err, "应该返回错误")
	assert.Nil(t, result)

	t.Logf("✅ 缺少 dataSource 正确被拒绝: %v", err)
}

// TestDataProxyQueryStandardTableSlowQueryLogs 测试标准表 slow_query_logs
func TestDataProxyQueryStandardTableSlowQueryLogs(t *testing.T) {
	const dataSource = "s3://o11y-prod-shared-us-east-1/deltalake/1372813089209061633/019b6fc2-d5db-7527-8497-3572ae6285d4/slowlogs"

	cfg, err := config.LoadDataProxyConfig("../configs/config-dataproxy.yaml")
	require.NoError(t, err)

	svc, err := service.NewDataProxyService(cfg)
	require.NoError(t, err)

	req := &dto.DataProxyQueryRequest{
		SQL:       `SELECT count(*), "date" FROM "clinic_data_proxy"."slow_query_logs" WHERE "date" IN ('20251230', '20251231') GROUP BY "date"`,
		ClusterId: "10754652599988043412",
		Timeout:   5 * time.Minute,
		Options: dto.DataProxyQueryOptions{
			DataSource: dataSource,
			Region:     "us-east-1",
		},
	}

	ctx := context.Background()
	result, err := svc.Query(ctx, req)

	require.NoError(t, err)
	assert.NotNil(t, result)
	assert.Greater(t, result.Metadata.RowCount, int64(0))

	t.Logf("✅ 标准表 slow_query_logs 查询成功: RowCount=%d", result.Metadata.RowCount)
}

// TestDataProxyQueryWithComplexSQL 测试复杂 SQL（聚合、GROUP BY）
func TestDataProxyQueryWithComplexSQL(t *testing.T) {
	const dataSource = "s3://o11y-prod-shared-us-east-1/deltalake/1372813089209061633/019b6fc2-d5db-7527-8497-3572ae6285d4/slowlogs"

	cfg, err := config.LoadDataProxyConfig("../configs/config-dataproxy.yaml")
	require.NoError(t, err)

	svc, err := service.NewDataProxyService(cfg)
	require.NoError(t, err)

	req := &dto.DataProxyQueryRequest{
		SQL: `SELECT
			count(*) as query_count,
			avg(query_time) as avg_query_time,
			max(query_time) as max_query_time
		FROM "clinic_data_proxy"."slow_query_logs"
		WHERE "date" = '20251230'`,
		ClusterId: "10754652599988043412",
		Timeout:   5 * time.Minute,
		Options: dto.DataProxyQueryOptions{
			DataSource: dataSource,
			Region:     "us-east-1",
		},
	}

	ctx := context.Background()
	result, err := svc.Query(ctx, req)

	require.NoError(t, err)
	assert.NotNil(t, result)
	assert.Equal(t, 1, len(result.Rows), "应该返回 1 行聚合结果")
	assert.Equal(t, 3, len(result.Columns), "应该有 3 列")

	t.Logf("✅ 复杂 SQL 查询成功: Columns=%v, Row=%v", result.Columns, result.Rows[0])
}

// TestDataProxyQueryResponseFormat 测试响应格式（验证不包含 result 字段）
func TestDataProxyQueryResponseFormat(t *testing.T) {
	const dataSource = "s3://o11y-prod-shared-us-east-1/deltalake/1372813089209061633/019b6fc2-d5db-7527-8497-3572ae6285d4/slowlogs"

	cfg, err := config.LoadDataProxyConfig("../configs/config-dataproxy.yaml")
	require.NoError(t, err)

	svc, err := service.NewDataProxyService(cfg)
	require.NoError(t, err)

	req := &dto.DataProxyQueryRequest{
		SQL:       `SELECT count(*) FROM "clinic_data_proxy"."slow_query_logs" WHERE "date" = '20251230'`,
		ClusterId: "10754652599988043412",
		Timeout:   5 * time.Minute,
		Options: dto.DataProxyQueryOptions{
			DataSource: dataSource,
			Region:     "us-east-1",
		},
	}

	ctx := context.Background()
	result, err := svc.Query(ctx, req)

	require.NoError(t, err)
	assert.NotNil(t, result)

	// 验证返回结果包含必要字段
	assert.NotEmpty(t, result.Columns, "应该有列信息")
	assert.NotEmpty(t, result.Rows, "应该有数据行")
	assert.NotEmpty(t, result.Metadata.QueryID, "应该有 QueryID")
	assert.NotEmpty(t, result.Metadata.Engine, "应该有 Engine")
	assert.NotEmpty(t, result.Metadata.Vendor, "应该有 Vendor")
	assert.NotEmpty(t, result.Metadata.Region, "应该有 Region")

	// 注意：result 字段（S3 路径）已从响应中删除，只在日志中记录

	t.Logf("✅ 响应格式验证通过: QueryID=%s, Engine=%s", result.Metadata.QueryID, result.Metadata.Engine)
}
