@import './functions/calc-math';

/*
 * Method which inserts a full background-image property for a theme image.
 * It checks if the file exists and if it doesn't, it'll throw an error.
 * By default it will not include the background-image property if it is not found,
 * but this can be changed by changing the default value of $enable-missing-images to
 * be true.
 */
@function theme-background-image($path, $extension: $image-extension, $nocheck: false) {
  $path: file_join($relative-image-path-for-uis, $path + '.' + $extension);
  $background-image: none;

  @if $path {
    @if $nocheck {
      $background-image: $path;
    } @else if theme_image_exists($image-search-path, $path) {
      $background-image: $path;
    } @else {
      @warn "@theme-background-image: Theme image not found: #{$path}";
      @if $enable-missing-images {
        $background-image: $path;
      }
    }

    @if $background-image != none {
      $background-image: url(file_join($theme-resource-path, $path));
    }
  } @else {
    @warn "@theme-background-image: No arguments passed";
  }

  @return $background-image;
}

@function get-image-url($path, $extension: $image-extension, $nocheck: false) {
  @return theme-background-image($path, $extension, $nocheck);
}

@function x($position) {
    @return parsebox($position, 1);
}
@function y($position) {
    @return parsebox($position, 2);
}

@function before($position) {
    @return parsebox($position, 1);
}
@function after($position) {
    @return parsebox($position, 2);
}

@function top($box) {
    @return parsebox($box, 1);
}
@function right($box) {
    @return parsebox($box, 2);
}
@function bottom($box) {
    @return parsebox($box, 3);
}
@function left($box) {
    @return parsebox($box, 4);
}
@function vertical($box) {
    $top: top($box);
    $bottom: bottom($box);

    @if $top == null or $bottom == null {
        @return null;
    }

    @return $top + $bottom;
}
@function horizontal($box) {
    $left: left($box);
    $right: right($box);

    @if $left == null or $right == null {
        @return null;
    }

    @return $left + $right;
}
@function boxmax($box) {
    @return max(max(top($box), right($box)), max(bottom($box), left($box)));
}
@function boxmin($box) {
    @return min(min(top($box), right($box)), min(bottom($box), left($box)));
}
@function boxContainsNull($list) {
  @for $i from 1 through length($list) {
    @if nth($list, $i) == null {
      @return true;
    }
  }
  @return false;
}

@function box($top, $right, $bottom, $left) {
    @if type-of($top) == list {
        $right: right($top);
        $bottom: bottom($top);
        $left: left($top);
        $top: top($top);
    }

    @if $top == $bottom and $right == $left {
        @if $top == $right {
            @return $top;
        }

        @return ($top $right);
    }

    @if $left == $right {
        @return ($top $right $bottom);
    }

    @return ($top $right $bottom $left);
}

@function rotate90($box) {
    @return box(left($box), top($box), right($box), bottom($box));
}

@function rotate180($box) {
    @return box(bottom($box), left($box), top($box), right($box));
}

@function rotate270($box) {
    @return box(right($box), bottom($box), left($box), top($box));
}

@function flip-vertical($box) {
    @return box(bottom($box), right($box), top($box), left($box));
}

@function flip-horizontal($box) {
    @return box(top($box), left($box), bottom($box), right($box));
}

@function rtl($box) {
    @return box(top($box), left($box), bottom($box), right($box));
}

@function rtl-background-position($pos) {
    $x: parsebox($pos, 1);
    $new-x: null;
    @if $x == right or $x == 100% {
        $new-x: 0;
    } @else if $x == 0 or $x == left {
        $new-x: right;
    } @else {
        $new-x: $x;
    }
    @return $new-x parsebox($pos, 2);
}

@function nopx ($value) {
    @if $value == 0 {
        @return 0;
    }
    @return $value / 1px;
}

@function invert-shadow($shadow, $axis) {
    @if $axis != x and $axis != y {
         @error 'invalid value for $axis: #{$axis}';
    }

    $inverted-shadow: ();

    $counter: if($axis == x, 2, 1);

    @for $i from 1 through length($shadow) {
        $item: nth($shadow, $i);

        @if type-of($item) == number {
            @if $counter == 2 {
                // the first number in a box-shadow value is always the offset-x,
                // the second number is always offset-y
                $item: -$item;
            }
            $counter: $counter + 1;
        }

        $inverted-shadow: append($inverted-shadow, $item);
    }

    @return $inverted-shadow;
}

@function coalesce($values...) {
    $found: false;
    $ret: null;
    @for $i from 1 through length($values) {
        $value: nth($values, $i);
        @if $value != null and not $found {
            $ret: $value;
            $found: true;
        }
    }
    @return $ret;
}
