diff --git a/cmd/user/create.go b/cmd/user/create.go
index 03dd0ba1aeee370f106b6b171b2fd063b03d0717..429e1c363e438b9717bd1ddfed88ab0ebe1bdb2c 100644
--- a/cmd/user/create.go
+++ b/cmd/user/create.go
@@ -214,48 +214,65 @@ func genGecos(u model.User) model.User {
     return u
 }
 
-// honestly... i had 3 functions that had a similar algorithm
-// and one that only redirected the flow. so i took it as a
-// challenge to merge them into one :D this it the result.
-// don't even bother trying to understand it, just go back
-// a few commits and read there
-func genLogin(name, grr, ltype string, variance int) string {
-    fix := 1
-    login := ""
-    var solo string
-    parts := formatName(name)
-
-    if len(parts) <= 1 {
-        if ltype != "ini" || len(parts) == 0 {
-            return "_"
-        }
-    }
-
-    if ltype == "first" {
-        login, parts, fix = parts[0], parts[1:], 0
-        variance++
-    }
+type LoginType int
 
-    if ltype == "last" {
-        solo, parts = parts[len(parts)-1], parts[:len(parts)-1]
-    }
+const (
+	Initials LoginType = iota
+	FirstName
+	LastName
+)
 
-    x := variance / len(parts)
-    y := variance % len(parts)
+func genLogin(name string, grr string, ltype LoginType, variance int) string {
+	parts := formatName(name)
+	if len(parts) == 0 {
+		return "_"
+	}
 
-    for i := range parts {
-        if y != 0 {
-            login += parts[i][:x+1+fix]
-            y--
-        } else {
-            login += parts[i][:x+fix]
-        }
-    }
+	part_prefix_len := make([]int, len(parts))
+	if ltype == Initials {
+		// a primeira letra de cada parte deve aparecer
+		for i := 0; i < len(parts); i++ {
+			part_prefix_len[i] = 1
+		}
+	} else if ltype == FirstName {
+		// a primeira parte inteira deve aparecer
+		part_prefix_len[0] = len(parts[0])
+	} else {
+		// a primeira letra de cada parte deve aparecer
+		for i := 0; i < len(parts); i++ {
+			part_prefix_len[i] = 1
+		}
+		// assim com a parte final do nome
+		part_prefix_len[len(parts)-1] = len(parts[len(parts)-1])
+	}
+	part_prefix_ix := 0
+	for i := 0; i < variance; i++ {
+		ok := false
+		for k := 0; k < len(parts) && !ok; k++ {
+			if part_prefix_len[part_prefix_ix] < len(parts[part_prefix_ix]) {
+				part_prefix_len[part_prefix_ix]++
+				ok = true
+			}
+			part_prefix_ix = (part_prefix_ix + 1) % len(parts)
+		}
+		if !ok {
+			// acabou o que fazer, vamos abandonar porque não vai mudar mais nada
+			break
+		}
+	}
 
-    if ltype == "ini" { login += grr[2:4] }
-    if ltype == "last" { login += solo }
+	login := ""
+	for i := 0; i < len(parts); i++ {
+		login += parts[i][:part_prefix_len[i]]
+	}
+	if login == "" {
+		return "_"
+	}
 
-    return login
+	if ltype == Initials {
+		login += grr[2:4]
+	}
+	return login
 }
 
 // removes connectives, leave all lowecase and splits the name
@@ -274,10 +291,18 @@ func formatName(name string) []string {
     return parts
 }
 
-func genUniqueUID(name, grr, ltype string, users []model.User) (string, error) {
+func genUniqueUID(name, grr string, ltypeString string, users []model.User) (string, error) {
     var uid string
     used, variance := true, 0
     for used {
+		var ltype LoginType
+		if ltypeString == "ini" {
+			ltype = Initials
+		} else if ltypeString == "first" {
+			ltype = FirstName
+		} else {
+			ltype = LastName
+		}
         uid = genLogin(name, grr, ltype, variance)
 
         // already taken or alias for it exists :(
@@ -517,6 +542,14 @@ func validateStatus(status string) error {
     return nil
 }
 
+func validateLtype(ltype string) error {
+	if ltype != "ini" && ltype != "first" && ltype != "last" {
+		err := fmt.Errorf("Login type can only be \"ini\", \"first\" or \"last\"")
+		return err
+	}
+	return nil
+}
+
 func validateGRR(grr string) error {
     // OK if empty, only "ini" login type requires it and we check :)
     if grr == "_" { return nil }
@@ -580,6 +613,11 @@ func validateInputs(opts model.Opts) error {
     err = validateStatus(opts.Status)
     if err != nil { return err }
 
+	err = validateLtype(opts.Ltype)
+	if err != nil {
+		return err
+	}
+
     // it’s OK if UID is empty here, we generate it later :)
     if opts.UID != "" {
         err := validateUID(opts.UID)
diff --git a/cmd/user/create_test.go b/cmd/user/create_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..ae52d43af451c8d84f575147da6a82ad48a022e3
--- /dev/null
+++ b/cmd/user/create_test.go
@@ -0,0 +1,110 @@
+package user
+
+import (
+	"reflect"
+	"testing"
+)
+
+func assertEqual(t *testing.T, a any, b any) {
+	if !reflect.DeepEqual(a, b) {
+		t.Fatalf("%s != %s", a, b)
+	}
+}
+
+func TestGenLogin(t *testing.T) {
+	assertEqual(t, genLogin("", "20241982", Initials, 0), "_")
+	assertEqual(t, genLogin("", "20241982", Initials, 1), "_")
+	assertEqual(t, genLogin("", "20241982", Initials, 2), "_")
+	assertEqual(t, genLogin("", "20241982", Initials, 3), "_")
+
+	assertEqual(t, genLogin("", "20241982", FirstName, 0), "_")
+	assertEqual(t, genLogin("", "20241982", FirstName, 1), "_")
+	assertEqual(t, genLogin("", "20241982", FirstName, 2), "_")
+	assertEqual(t, genLogin("", "20241982", FirstName, 3), "_")
+
+	assertEqual(t, genLogin("", "20241982", LastName, 0), "_")
+	assertEqual(t, genLogin("", "20241982", LastName, 1), "_")
+	assertEqual(t, genLogin("", "20241982", LastName, 2), "_")
+	assertEqual(t, genLogin("", "20241982", LastName, 3), "_")
+
+	assertEqual(t, genLogin("de", "20241982", Initials, 0), "_")
+	assertEqual(t, genLogin("de", "20241982", Initials, 1), "_")
+	assertEqual(t, genLogin("de", "20241982", Initials, 2), "_")
+	assertEqual(t, genLogin("de", "20241982", Initials, 3), "_")
+
+	assertEqual(t, genLogin("de", "20241982", FirstName, 0), "_")
+	assertEqual(t, genLogin("de", "20241982", FirstName, 1), "_")
+	assertEqual(t, genLogin("de", "20241982", FirstName, 2), "_")
+	assertEqual(t, genLogin("de", "20241982", FirstName, 3), "_")
+
+	assertEqual(t, genLogin("de", "20241982", LastName, 0), "_")
+	assertEqual(t, genLogin("de", "20241982", LastName, 1), "_")
+	assertEqual(t, genLogin("de", "20241982", LastName, 2), "_")
+	assertEqual(t, genLogin("de", "20241982", LastName, 3), "_")
+
+	assertEqual(t, genLogin("da de", "20241982", Initials, 0), "_")
+	assertEqual(t, genLogin("da de", "20241982", Initials, 1), "_")
+	assertEqual(t, genLogin("da de", "20241982", Initials, 2), "_")
+	assertEqual(t, genLogin("da de", "20241982", Initials, 3), "_")
+
+	assertEqual(t, genLogin("da de", "20241982", FirstName, 0), "_")
+	assertEqual(t, genLogin("da de", "20241982", FirstName, 1), "_")
+	assertEqual(t, genLogin("da de", "20241982", FirstName, 2), "_")
+	assertEqual(t, genLogin("da de", "20241982", FirstName, 3), "_")
+
+	assertEqual(t, genLogin("da de", "20241982", LastName, 0), "_")
+	assertEqual(t, genLogin("da de", "20241982", LastName, 1), "_")
+	assertEqual(t, genLogin("da de", "20241982", LastName, 2), "_")
+	assertEqual(t, genLogin("da de", "20241982", LastName, 3), "_")
+
+	assertEqual(t, genLogin("Fabiano", "20241982", Initials, 0), "f24")
+	assertEqual(t, genLogin("Fabiano", "20241982", Initials, 1), "fa24")
+	assertEqual(t, genLogin("Fabiano", "20241982", Initials, 2), "fab24")
+	assertEqual(t, genLogin("Fabiano", "20241982", Initials, 3), "fabi24")
+
+	assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 0), "fabiano")
+	assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 1), "fabiano")
+	assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 2), "fabiano")
+	assertEqual(t, genLogin("Fabiano", "20241982", FirstName, 3), "fabiano")
+
+	assertEqual(t, genLogin("Fabiano", "20241982", LastName, 0), "fabiano")
+	assertEqual(t, genLogin("Fabiano", "20241982", LastName, 1), "fabiano")
+	assertEqual(t, genLogin("Fabiano", "20241982", LastName, 2), "fabiano")
+	assertEqual(t, genLogin("Fabiano", "20241982", LastName, 3), "fabiano")
+
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 0), "faps24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 1), "faaps24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 2), "faanps24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 3), "faanpes24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 14), "fabiaantunperesouz24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 18), "fabianantunepereisouza24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 19), "fabianantunepereirsouza24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 20), "fabianoantunepereirsouza24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 21), "fabianoantunespereirsouza24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 22), "fabianoantunespereirasouza24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 40), "fabianoantunespereirasouza24")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", Initials, 50), "fabianoantunespereirasouza24")
+
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 0), "fabiano")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 1), "fabianoa")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 2), "fabianoap")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 3), "fabianoaps")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 4), "fabianoanps")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 16), "fabianoantunepereisouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 17), "fabianoantunepereirsouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 18), "fabianoantunespereirsouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 19), "fabianoantunespereirasouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 20), "fabianoantunespereirasouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", FirstName, 50), "fabianoantunespereirasouza")
+
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 0), "fapsouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 1), "faapsouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 2), "faanpsouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 3), "faanpesouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 15), "fabianantunepereirsouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 16), "fabianoantunepereirsouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 17), "fabianoantunespereirsouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 18), "fabianoantunespereirasouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 19), "fabianoantunespereirasouza")
+	assertEqual(t, genLogin("Fabiano Antunes Pereira de Souza", "20241982", LastName, 100), "fabianoantunespereirasouza")
+}