// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

@import "../assets/theme";

@mixin filled-color-scheme($intent-color, $text-color) {
  color: $text-color;
  background: $intent-color;

  &:hover {
    background: color_hover($intent-color);
  }

  &:active,
  &.pf-active {
    background: color_active($intent-color);
  }

  &[disabled] {
    &:hover {
      background: $intent-color;
    }

    &.pf-active {
      background: color_active($intent-color);
    }
  }
}

@keyframes pf-spinner-rotation {
  from {
    transform: rotate(0deg);
  }

  to {
    transform: rotate(360deg);
  }
}

.pf-button {
  font-family: var(--pf-font-compact);
  line-height: 1;
  user-select: none;
  border-radius: $border-radius;
  padding: 4px 8px;
  white-space: nowrap;
  min-width: max-content;
  position: relative;

  &--loading {
    // The button is unclickable when loading
    pointer-events: none;

    .pf-button__label,
    .pf-left-icon,
    .pf-right-icon {
      visibility: hidden;
    }

    &::after {
      content: "";
      height: 0.9em;
      width: 0.9em;
      border-radius: 100px;
      border-style: solid;
      border-width: 0.15em;
      border-color: var(--pf-color-border);
      border-top-color: var(--pf-color-primary);
      position: absolute;
      inset: 50%;
      translate: -50% -50%;
      animation: pf-spinner-rotation 1s infinite linear;
    }
  }

  &--shrink {
    min-width: 0;
    text-overflow: ellipsis;
    overflow: hidden;
  }

  &--rounded {
    border-radius: 100px;
  }

  & > .pf-left-icon {
    margin-right: 6px; // Make some room between the icon and label
  }

  & > .pf-right-icon {
    margin-left: 6px; // Make some room between the icon and label
  }

  &__tooltip {
    font-size: var(--pf-font-size-s);
  }

  &:focus-visible {
    @include focus;
  }

  // Reduce padding when compact
  &.pf-compact {
    padding: 2px 4px;
    & > .pf-left-icon {
      margin-right: 2px;
    }

    & > .pf-right-icon {
      margin-left: 2px;
    }
  }

  // Reduce padding when we are icon-only
  &.pf-icon-only {
    & > .pf-left-icon {
      margin: 0;
    }

    padding: 4px;

    &.pf-compact {
      padding: 0;
    }

    &::before {
      // Inserting a zero-width space to keep the button in flow. This allows it
      // to stay aligned with the baseline of other text around it.
      content: "\200B"; /* Zero-width space */
    }
  }

  &[disabled] {
    filter: opacity(50%);
    cursor: not-allowed;
  }

  // From here on in we just describe the colors
  &--filled {
    background: color-mix(
      in srgb,
      transparent,
      var(--pf-color-interactive-base) 10%
    );

    &:hover {
      background: color-mix(
        in srgb,
        transparent,
        var(--pf-color-interactive-base) 15%
      );
    }

    &.pf-active,
    &:active {
      background: color-mix(
        in srgb,
        transparent,
        var(--pf-color-interactive-base) 20%
      );
    }

    &[disabled] {
      &:hover {
        background: color-mix(
          in srgb,
          transparent,
          var(--pf-color-interactive-base) 10%
        ); // Reset to the default background
      }

      &.pf-active {
        background: color-mix(
          in srgb,
          transparent,
          var(--pf-color-interactive-base) 40%
        );
      }
    }

    &.pf-intent-primary {
      @include filled-color-scheme(
        var(--pf-color-primary),
        var(--pf-color-text-on-primary)
      );
    }

    &.pf-intent-success {
      @include filled-color-scheme(
        var(--pf-color-success),
        var(--pf-color-text-on-success)
      );
    }

    &.pf-intent-danger {
      @include filled-color-scheme(
        var(--pf-color-danger),
        var(--pf-color-text-on-danger)
      );
    }

    &.pf-intent-warning {
      @include filled-color-scheme(
        var(--pf-color-warning),
        var(--pf-color-text-on-warning)
      );
    }
  }

  &--outlined {
    border: solid 1px var(--pf-color-border);
  }

  &--minimal,
  &--outlined {
    &:hover {
      background: color_hover(transparent);
    }

    &:active,
    &.pf-active {
      background: color_active(transparent);
    }

    &.pf-intent-primary {
      color: var(--pf-color-primary);
    }

    &.pf-intent-success {
      color: var(--pf-color-success);
    }

    &.pf-intent-danger {
      color: var(--pf-color-danger);
    }

    &.pf-intent-warning {
      color: var(--pf-color-warning);
    }

    &[disabled] {
      &:hover {
        background: unset;
      }

      &.pf-active {
        background: color_active(transparent);
      }
    }
  }
}

.pf-button-bar {
  display: flex;
  flex-direction: row;
  gap: 2px;
  align-items: baseline;
}

.pf-button-group {
  display: flex;
  flex-direction: row;
  align-items: baseline;

  .pf-button:not(:last-child) {
    border-top-right-radius: unset;
    border-bottom-right-radius: unset;
    border-right: unset;
  }

  .pf-button:not(:first-child) {
    border-top-left-radius: unset;
    border-bottom-left-radius: unset;
  }
}
