package lake

import (
	"crypto/sha256"
	"encoding/hex"
	"errors"
	"strings"
	"unicode"
)

const externalNameSlugLimit = 40

type ResourceNames struct {
	DataSource string
	Task       string
}

// DeterministicResourceNames returns stable, collision-resistant external
// names used to adopt Lake resources after an unknown create result.
func DeterministicResourceNames(pipelineID string) (ResourceNames, error) {
	if strings.TrimSpace(pipelineID) == "" {
		return ResourceNames{}, errors.New("pipeline id is required")
	}
	slug := sanitizeNamePart(pipelineID)
	digest := sha256.Sum256([]byte(pipelineID))
	suffix := hex.EncodeToString(digest[:6])
	return ResourceNames{
		DataSource: "tidb-dp-ds-" + slug + "-" + suffix,
		Task:       "tidb-dp-task-" + slug + "-" + suffix,
	}, nil
}

func sanitizeNamePart(value string) string {
	var builder strings.Builder
	for _, r := range value {
		if unicode.IsLetter(r) || unicode.IsDigit(r) || r == '-' || r == '_' {
			builder.WriteRune(r)
		} else {
			builder.WriteByte('-')
		}
		if builder.Len() >= externalNameSlugLimit {
			break
		}
	}
	slug := strings.Trim(builder.String(), "-_")
	if slug == "" {
		return "pipeline"
	}
	return slug
}
