package sqlite import ( "fmt" "strings" "unicode" ) // DeriveProjectCode builds a 3-letter uppercase code from a project name. // Non-letters are skipped; short results are padded with X. func DeriveProjectCode(name string) string { var b strings.Builder for _, r := range strings.ToUpper(name) { if unicode.IsLetter(r) && r < unicode.MaxASCII { b.WriteRune(r) if b.Len() == 3 { break } } } code := b.String() for len(code) < 3 { code += "X" } return code } // nextUniqueCode returns base or a nearby 3-char variant until unused. // used maps existing codes (uppercase) → true. func nextUniqueCode(base string, used map[string]bool) string { base = DeriveProjectCode(base) if !used[base] { return base } prefix := base[:2] for _, c := range "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" { cand := prefix + string(c) if !used[cand] { return cand } } for i := 0; i < 1000; i++ { cand := fmt.Sprintf("%c%02d", base[0], i) if !used[cand] { return cand } } return fmt.Sprintf("X%02d", len(used)%100) }