package console

import (
	"context"

	"github.com/tidbcloud/serverless-service/idl/pbgen/proto/console"
	"github.com/tidbcloud/serverless-service/internal/service/console_auditlog"
	"github.com/tidbcloud/serverless-service/internal/utils"
	"github.com/tidbcloud/tiinf/sdk/auditlog"
)

func recordCreateImportAuditLog(
	ctx context.Context,
	req *console.CreateImportReq,
	resp *console.Import,
	err error,
) {
	eventType := importSourceEvent(req.GetSource().GetType())
	details := buildCreateImportDetails(req, resp)
	console_auditlog.SubmitWithStringIDs(
		ctx,
		eventType,
		req.GetOrgId(),
		req.GetProjectId(),
		req.GetClusterId(),
		details,
		err,
	)
}

func recordCancelImportAuditLog(
	ctx context.Context,
	req *console.ImportIds,
	err error,
) {
	details := auditlog.Details{
		auditlog.KeyImportID:     req.GetId(),
		auditlog.KeyImportStatus: "canceled",
	}
	console_auditlog.SubmitWithStringIDs(
		ctx,
		auditlog.EventImportDataCanceled,
		req.GetOrgId(),
		req.GetProjectId(),
		req.GetClusterId(),
		details,
		err,
	)
}

func importSourceEvent(sourceType console.ImportSourceType_Enum) auditlog.EventType {
	switch sourceType {
	case console.ImportSourceType_S3, console.ImportSourceType_S3_COMPATIBLE:
		return auditlog.EventImportDataFromAWS
	case console.ImportSourceType_GCS:
		return auditlog.EventImportDataFromGCP
	case console.ImportSourceType_AZURE_BLOB:
		return auditlog.EventImportDataFromAzure
	case console.ImportSourceType_OSS:
		return auditlog.EventImportDataFromAlibabaCloud
	default:
		return auditlog.EventImportDataFromLocal
	}
}

func buildCreateImportDetails(req *console.CreateImportReq, resp *console.Import) auditlog.Details {
	details := auditlog.Details{}
	if resp != nil && resp.GetId() != "" {
		details[auditlog.KeyImportID] = resp.GetId()
	}
	if req.GetImportOptions().GetDisplayName() != "" {
		details[auditlog.KeyDisplayName] = req.GetImportOptions().GetDisplayName()
	}
	if resp != nil && resp.GetDisplayName() != "" {
		details[auditlog.KeyDisplayName] = resp.GetDisplayName()
	}
	if req.GetImportOptions().GetFileType() != console.ImportFileType_UNSPECIFIED {
		details[auditlog.KeyDataFormat] = req.GetImportOptions().GetFileType().String()
	}

	switch req.GetSource().GetType() {
	case console.ImportSourceType_LOCAL:
		local := req.GetSource().GetLocal()
		if local != nil {
			details[auditlog.KeySourceFileName] = local.GetFileName()
			if local.GetUploadId() != "" {
				details[auditlog.KeyBucketUri] = local.GetUploadId()
			}
		}
	case console.ImportSourceType_S3, console.ImportSourceType_S3_COMPATIBLE:
		if req.GetSource().GetType() == console.ImportSourceType_S3_COMPATIBLE {
			if s3Compat := req.GetSource().GetS3Compatible(); s3Compat != nil {
				details[auditlog.KeyBucketUri] = utils.RedactSourceURI(s3Compat.GetUri())
			}
		} else if s3 := req.GetSource().GetS3(); s3 != nil {
			details[auditlog.KeyBucketUri] = utils.RedactSourceURI(s3.GetUri())
			if s3.GetRoleArn() != "" {
				details[auditlog.KeyRoleArn] = s3.GetRoleArn()
			}
		}
	case console.ImportSourceType_GCS:
		if gcs := req.GetSource().GetGcs(); gcs != nil {
			details[auditlog.KeyBucketUri] = utils.RedactSourceURI(gcs.GetUri())
		}
	case console.ImportSourceType_AZURE_BLOB:
		if az := req.GetSource().GetAzureBlob(); az != nil {
			details[auditlog.KeyBucketUri] = utils.RedactSourceURI(az.GetUri())
		}
	case console.ImportSourceType_OSS:
		if oss := req.GetSource().GetOss(); oss != nil {
			details[auditlog.KeyBucketUri] = utils.RedactSourceURI(oss.GetUri())
		}
	}
	return details
}
