@use "sass:map";
@use "system/breakpoints";

// Text size
$sizes: (
  "alfa": (
    "size": 3.375rem,
    "line-height": 5.125rem,
    "letter-spacing": -0.4px,
  ),
  "bravo": (
    "size": 2.5rem,
    "line-height": 3.75rem,
    "letter-spacing": -0.2px,
  ),
  "charlie": (
    "size": 2.25rem,
    "line-height": 3.375rem,
    "letter-spacing": -0.2px,
  ),
  "delta": (
    "size": 1.875rem,
    "line-height": 2.75rem,
    "letter-spacing": -0.2px,
  ),
  "echo": (
    "size": 1.75rem,
    "line-height": 2.625rem,
    "letter-spacing": -0.2px,
  ),
  "foxtrot": (
    "size": 1.625rem,
    "line-height": 2.5rem,
    "letter-spacing": -0.2px,
  ),
  "golf": (
    "size": 1.5rem,
    "line-height": 2.25rem,
    "letter-spacing": -0.2px,
  ),
  "hotel": (
    "size": 1.375rem,
    "line-height": 2.125rem,
    "letter-spacing": -0.2px,
  ),
  "india": (
    "size": 1.25rem,
    "line-height": 2rem,
    "letter-spacing": -0.2px,
  ),
  "juliett": (
    "size": 1.125rem,
    "line-height": 1.75rem,
    "letter-spacing": -0.2px,
  ),
  "kilo": (
    "size": 1rem,
    "line-height": 1.5rem,
    "letter-spacing": -0.2px,
  ),
  "lima": (
    "size": 0.875rem,
    "line-height": 1.375rem,
    "letter-spacing": -0.2px,
  ),
);

@mixin size($name) {
  @if map.has-key($sizes, $name) {
    font-size: map.get($sizes, $name, "size");
    hyphens: auto;
    line-height: map.get($sizes, $name, "line-height");
    letter-spacing: map.get($sizes, $name, "letter-spacing");
  } @else {
    @error "Size #{$name} is invalid. Size must be one of: #{map.keys($sizes)}.";
  }
}
@each $name, $values in $sizes {
  %ods-text--size-#{$name} {
    @include size($name);
  }
}
@each $name, $values in $sizes {
  %ods-text--size-#{$name}-breakpoint-medium {
    @include breakpoints.medium {
      @include size($name);
    }
  }
}
@each $name, $values in $sizes {
  %ods-text--size-#{$name}-breakpoint-large {
    @include breakpoints.large {
      @include size($name);
    }
  }
}

// Text weight
$weights: (
  "light": 300,
  "regular": 400,
  "medium": 500,
  "bold": 700,
);
@mixin weight($name) {
  @if map.has-key($weights, $name) {
    font-weight: map.get($weights, $name);
  } @else {
    @error "Weight #{$name} is invalid. Weight must be one of: #{map.keys($weights)}.";
  }
}
@each $name, $values in $weights {
  %ods-text--weight-#{$name} {
    @include weight($name);
  }
}
@each $name, $values in $weights {
  %ods-text--weight-#{$name}-breakpoint-medium {
    @include breakpoints.medium {
      @include weight($name);
    }
  }
}
@each $name, $values in $weights {
  %ods-text--weight-#{$name}-breakpoint-large {
    @include breakpoints.large {
      @include weight($name);
    }
  }
}

// Text style
$styles: (
  "italic": 1,
);
@mixin style($name) {
  @if map.has-key($styles, $name) {
    font-style: #{$name};
  } @else {
    @error "Style #{$name} is invalid. Style must be one of: #{map.keys($styles)}.";
  }
}
@each $name, $values in $styles {
  %ods-text--style-#{$name} {
    @include style($name);
  }
}
@each $name, $values in $styles {
  %ods-text--style-#{$name}-breakpoint-medium {
    @include breakpoints.medium {
      @include style($name);
    }
  }
}
@each $name, $values in $styles {
  %ods-text--style-#{$name}-breakpoint-large {
    @include breakpoints.large {
      @include style($name);
    }
  }
}

// Text alignment
$alignments: (
  "left": 1,
  "right": 1,
  "center": 1,
);
@mixin align($name) {
  @if map.has-key($alignments, $name) {
    text-align: #{$name};
  } @else {
    @error "Align #{$name} is invalid. Align must be one of: #{map.keys($alignments)}.";
  }
}
@each $name, $values in $alignments {
  %ods-text--align-#{$name} {
    @include align($name);
  }
}
@each $name, $values in $alignments {
  %ods-text--align-#{$name}-breakpoint-medium {
    @include breakpoints.medium {
      @include align($name);
    }
  }
}
@each $name, $values in $alignments {
  %ods-text--align-#{$name}-breakpoint-large {
    @include breakpoints.large {
      @include align($name);
    }
  }
}

// Text modifiers
$modifiers: (
  "nowrap": (
    "white-space": nowrap,
  ),
  "truncate": (
    "overflow": hidden,
    "text-overflow": ellipsis,
    "white-space": nowrap,
  ),
);

@mixin modifier($name) {
  @if map.has-key($modifiers, $name) {
    @each $property, $value in map.get($modifiers, $name) {
      #{$property}: $value;
    }
  } @else {
    @error "Text modifier #{$name} is invalid. Text modifier must be one of: #{map.keys($modifiers)}.";
  }
}

@each $name, $values in $modifiers {
  %ods-text--#{$name} {
    @include modifier($name);
  }
}
@each $name, $values in $modifiers {
  %ods-text--#{$name}-breakpoint-medium {
    @include breakpoints.medium {
      @include modifier($name);
    }
  }
}
@each $name, $values in $modifiers {
  %ods-text--#{$name}-breakpoint-large {
    @include breakpoints.large {
      @include modifier($name);
    }
  }
}