# Reglas de normalización finales 

# Elimina todo lo que no sea número
# tienen 10 digitos y empieza con 15 se agrega +54911 y se quita el 15: 15xxxxxxxx ---> +54911xxxxxxxx
# tienen 10 digitos y empieza con 11 se agrega +549: 11xxxxxxxx ---> +54911xxxxxxxx
# tienen 11 digitos y empieza con 011 se agrega +549 quitandose el primer 0: 011xxxxxxxx ---> +54911xxxxxxxx
# tienen mas de 10  y empieza con 54911 se agrega + al principio: 54911…. ---> +54911…
# tienen mas de 10  y empieza con 01115 se agrega +549 y se quita el 0 del principio y el 15: 01115…… ---> +54911……
# tienen 11 digitos y empieza con +1 (USA) dejar como esta ( +1xxxxxxxx ---> +1xxxxxxxx)
# Tienen 11 digitos y Empiezan con 9 se agrega +54: 9xxxxxxxxxx --> +549xxxxxxxxxx
# tienen 11 digitos y empieza con 015 se agrega +54911 y se quita el 015 del principio: 015xxxxxxxx ---> +54 911xxxxxxxx
# Empiezan con 5411 se quita el 5411 y se pone +54911: 5411xxxxxx --> +54911xxxxxx
# Empiezan con 54911 se agrega +: 5411xxxxxx --> +54911xxxxxx
# tienen 13 digitos y empieza con 01115 se agrega +54911 y se quita el 01115 : 01115xxxxxxxx ---> +54 911xxxxxxxx
# tienen 10 digitos: xxxxxxxxxx se agrega +549 --> +549xxxxxxxxxx
# tienen 11 digitos y empieza con 0 se quita el 0 y se agrega +549: 0xxxxxxxxxx --> +549xxxxxxxxxx
# tienen 13 digitos, empieza con 0 y tiene un 15 se quita el 0 y el 15 y se agrega +549 al principio: 0…15…. ---> +549……..
# tienen 12 digitos y tiene un 15 se quita el 15 y se agrega +549: …15…. ---> +549……..
# comienzan con 00 se quita el 00 y se agrega un +: 00….  ---> +….
# tienen 8 digitos se agrega +54911: xxxxxxxx ---> +54911xxxxxxxx
# Comeinzan con 598 o +598 se deja con +598:    +598…..
# Comeinzan con + se quedan como estas:   +….. ---> +…..
# Comeinzan con 5 y tienen mas de 10 digitos se agrega +: 5…. ---> +5….



# ✓ IMPLEMENTADO: si empieza con un 0 y tiene mas de 10 digitos y 15 en algun lado , reemplazar el 0 por +549 y quitar el 15: 0...15... ---> +549...


SET limpio = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
              pn, ' ', ''), '-', ''), '(', ''), ')', ''), '.', ''), '/', ''), ',', ''), CHAR(13), ''), CHAR(10), ''), '+', '');

DROP FUNCTION IF EXISTS normalizartelefono;
DELIMITER $$

CREATE FUNCTION normalizartelefono(pn VARCHAR(255)) RETURNS VARCHAR(20)
BEGIN
  DECLARE limpio VARCHAR(255);
  DECLARE digits VARCHAR(20);
  DECLARE len INT;
  DECLARE pos INT;

  -- 1. Elimina todo lo que no sea número
  
  SET limpio = strip_non_digit(pn);


  SET digits = limpio;
  SET len = CHAR_LENGTH(digits);

  -- Si hay menos de 8 dígitos, devolver vacío
  IF len < 8 THEN
    RETURN '';
  END IF;

  -- Si todos los dígitos son iguales, devolver vacío
  IF digits = REPEAT(LEFT(digits,1), len) THEN
    RETURN '';
  END IF;

  -- 22. 12 dígitos, comienza con 54 pero no con 549
  IF len = 12 AND LEFT(digits, 2) = '54' AND LEFT(digits, 3) <> '549' THEN
    RETURN CONCAT('+54', '9', SUBSTRING(digits, 3));
  END IF;

  -- 2. 10 dígitos y empieza con 15
  IF len = 10 AND LEFT(digits, 2) = '15' THEN
    RETURN CONCAT('+54911', SUBSTRING(digits, 3));
  END IF;

  -- 3. 10 dígitos y empieza con 11
  IF len = 10 AND LEFT(digits, 2) = '11' THEN
    RETURN CONCAT('+54911', SUBSTRING(digits, 3));
  END IF;

  -- 4. 11 dígitos y empieza con 011
  IF len = 11 AND LEFT(digits, 3) = '011' THEN
    RETURN CONCAT('+54911', SUBSTRING(digits, 4));
  END IF;

  -- 5. Más de 10 y empieza con 54911
  IF len > 10 AND LEFT(digits, 5) = '54911' THEN
    RETURN CONCAT('+', digits);
  END IF;

  -- 6. Más de 10 y empieza con 01115
  IF len > 10 AND LEFT(digits, 5) = '01115' THEN
    RETURN CONCAT('+54911', SUBSTRING(digits, 6));
  END IF;

  -- 7. 11 dígitos y empieza con +1 (USA)
  IF LEFT(pn, 2) = '+1' AND len = 11 THEN
    RETURN CONCAT('+',digits);
  END IF;

  -- 8. 11 dígitos y empieza con 9
  IF len = 11 AND LEFT(digits, 1) = '9' THEN
    RETURN CONCAT('+549', SUBSTRING(digits, 2));
  END IF;

  -- 9. 11 dígitos y empieza con 015
  IF len = 11 AND LEFT(digits, 3) = '015' THEN
    RETURN CONCAT('+54911', SUBSTRING(digits, 4));
  END IF;

  -- 10. Empieza con 5411
  IF LEFT(digits, 4) = '5411' THEN
    RETURN CONCAT('+54911', SUBSTRING(digits, 5));
  END IF;

  -- 11. Empieza con 54911
  IF LEFT(digits, 5) = '54911' THEN
    RETURN CONCAT('+', digits);
  END IF;

  -- 12. 13 dígitos y empieza con 01115
  IF len = 13 AND LEFT(digits, 5) = '01115' THEN
    RETURN CONCAT('+54911', SUBSTRING(digits, 6));
  END IF;

  -- 13. 10 dígitos
  IF len = 10 THEN
    RETURN CONCAT('+549', digits);
  END IF;

  -- 14. 11 dígitos y empieza con 0
  IF len = 11 AND LEFT(digits, 1) = '0' THEN
    RETURN CONCAT('+549', SUBSTRING(digits, 2));
  END IF;

  -- 15. 13 dígitos, empieza con 0 y tiene un 15
  IF len = 13 AND LEFT(digits, 1) = '0' AND LOCATE('15', digits) > 0 THEN
    SET digits = SUBSTRING(digits, 2);
    SET pos = LOCATE('15', digits);
    IF pos > 0 THEN
      SET digits = CONCAT(SUBSTRING(digits, 1, pos - 1), SUBSTRING(digits, pos + 2));
    END IF;
    RETURN CONCAT('+549', digits);
  END IF;

  -- 16. 12 dígitos y tiene un 15
  IF len = 12 AND LOCATE('15', digits) > 0 THEN
    SET pos = LOCATE('15', digits);
    IF pos > 0 THEN
      SET digits = CONCAT(SUBSTRING(digits, 1, pos - 1), SUBSTRING(digits, pos + 2));
    END IF;
    RETURN CONCAT('+549', digits);
  END IF;

  -- 17. Comienza con 00
  IF LEFT(digits, 2) = '00' THEN
    RETURN CONCAT('+', SUBSTRING(digits, 3));
  END IF;

  -- 18. 8 dígitos
  IF len = 8 THEN
    RETURN CONCAT('+54911', digits);
  END IF;

  -- 19. Comienza con 598 o +598
  IF LEFT(digits, 3) = '598' OR LEFT(pn, 4) = '+598' THEN
    RETURN CONCAT('+598', SUBSTRING(digits, 4));
  END IF;

  -- 20. Comienza con +
  IF LEFT(pn, 1) = '+' THEN
    RETURN concat('+',digits);
  END IF;

  -- 21. Comienza con 5 y tiene más de 10 dígitos
  IF LEFT(digits, 1) = '5' AND len > 10 THEN
    RETURN CONCAT('+', digits);
  END IF;

  
  -- Fallback
  RETURN CONCAT('+549', digits);
END$$

DELIMITER ;
