@use 'sass:math';
@use 'sass:meta';
@use 'sass:string';
@use 'sass:list';
@use 'sass:map';
@use 'character';
@use 'src/module/spacing/variable/units';

@function is-num($value) {
  $char: string.slice($value, 1, 1);
  @if character.is-int($char) {
    @return true;
  }
  @if $char == '-' and string.length($value) >= 2 {
    $char: string.slice($value, 2, 2);
    @if character.is-int($char) {
      @return true;
    }
  }
  @return false;
}

/// Fonction de transformation d'une string en nombre intégral
/// @access public
/// @param {String} $value - le nombre en chaîne de caractères
@function to-num($value) {
  @if meta.type-of($value) != string {
    @return $value;
  }
  $length: string.length($value);
  $int: ();
  $float: ();
  $floating: false;
  $neg: false;

  @for $i from 1 through $length {
    $n: string.slice($value, $i, $i);

    @if $n == '.' {
      $floating: true;
    }
    @else if $n == '-' {
      $neg: true;
    }
    @else {
      @if character.is-int($n) {
        @if $floating {
          $float: list.append($float, character.to-int($n));
        }
        @else {
          $int: list.append($int, character.to-int($n));
        }
      }
    }
  }

  $result: 0;

  $length: list.length($int);
  @if $length > 0 {
    @for $i from 1 through $length {
      $result: $result + (list.nth($int, $i) * math.pow(10, $length - $i));
    }
  }

  $length: list.length($float);
  @if $length > 0 {
    @for $i from 1 through $length {
      $result: $result + math.div(list.nth($float, $i), math.pow(10, $i));
    }
  }

  @if $neg {
    $result: -$result;
  }

  @if '#{$result}' == $value {
    @return $result;
  }

  $unit: string.slice($value, string.length('#{$result}' + 1));

  @if map.has-key(units.$values, $unit) {
    @return $result * map.get(units.$values, $unit);
  }

  @return $result;
}
