From e49eca75023cb3d53baf3f06ac71b9394d05bbb5 Mon Sep 17 00:00:00 2001
From: Theo S Schult <tss24@inf.ufpr.br>
Date: Thu, 20 Feb 2025 14:09:03 -0300
Subject: [PATCH] Sorcery to unify genLogin* functions

---
 cmd/user/create.go | 107 +++++++++++----------------------------------
 1 file changed, 26 insertions(+), 81 deletions(-)

diff --git a/cmd/user/create.go b/cmd/user/create.go
index 94faae8..438505c 100644
--- a/cmd/user/create.go
+++ b/cmd/user/create.go
@@ -231,42 +231,47 @@ func genGecos(u model.User) model.User {
     return u
 }
 
-// basically takes the initials and the grr year.
-// if variance increases we take next letter of
-// 1st name, then next letter of 2nd name, etc...
-func genLoginIni(name string, grr string, variance int) string {
+// 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) == 0 {
-        return "_"
+    if len(parts) <= 1 {
+        if ltype != "ini" || len(parts) == 0 {
+            return "_"
+        }
+    }
+
+    if ltype == "first" {
+        login, parts, fix = parts[0], parts[1:], 0
+        variance++
+    }
+
+    if ltype == "last" {
+        solo, parts = parts[len(parts)-1], parts[:len(parts)-1]
     }
+
     x := variance / len(parts)
     y := variance % len(parts)
 
     for i := range parts {
         if y != 0 {
-            login += parts[i][:x+2]  
+            login += parts[i][:x+1+fix]
             y--
         } else {
-            login += parts[i][:x+1]
+            login += parts[i][:x+fix]
         }
     }
 
-    return login + grr[2:4]
-}
+    if ltype == "ini" { login += grr[2:4] }
+    if ltype == "last" { login += solo }
 
-// parent function for generating a login automatically
-func genLogin(name string, grr string, ltype string, variance int) string {
-    var login string
-    switch ltype {
-    case "", "ini":
-        login = genLoginIni(name, grr, variance)
-    case "first":
-        login = genLoginFirst(name, variance)
-    case "last":
-        login = genLoginLast(name, variance)
-    }
     return login
 }
 
@@ -286,66 +291,6 @@ func formatName(name string) []string {
     return parts
 }
 
-// basically takes 1st name and the initial of the 2nd.
-// if variance increases we take more initials, and if
-// it keeps going we put more letters in each name
-func genLoginFirst(name string, variance int) string {
-    parts := formatName(name)
-
-    if len(parts) == 0 {
-        return "_"
-    }
-
-    // Separate first name
-    first, parts := parts[0], parts[1:]
-    login := first
-
-    variance++
-    x := variance / len(parts)
-    y := variance % len(parts)
-
-    for i := range parts {
-        if y != 0 {
-            login += parts[i][:x+1]
-            y--
-        } else {
-            login += parts[i][:x]
-        }
-    }
-
-    return login
-}
-
-// basically takes initials up to last name and then appends it.
-// if variance increases we put more letters in each name
-func genLoginLast(name string, variance int) string {
-    login := ""
-    parts := formatName(name)
-
-    if len(parts) <= 1 {
-        return "_"
-    }
-
-    // Separate last name
-    last, parts := parts[len(parts)-1], parts[:len(parts)-1]
-
-    x := variance / len(parts)
-    y := variance % len(parts)
-
-    for i := range parts {
-        if y != 0 {
-            login += parts[i][:x+2]
-            y--
-        } else {
-            login += parts[i][:x+1]
-        }
-    }
-
-    login += last
-
-    return login
-}
-
 func genUniqueUID(name, grr, ltype string, users []model.User) (string, error) {
     var uid string
     used, variance := true, 0
-- 
GitLab