// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

@use 'sass:color';
@use '../mixins';
@use '../variables';

.module-Button {
  @mixin focus-box-shadow($inner-color, $outer-color) {
    &:focus {
      box-shadow:
        0 0 0 1px $inner-color,
        0 0 0 4px $outer-color;
    }
  }

  @mixin hover-and-active-states($background-color, $mix-color) {
    &:hover {
      @include mixins.not-disabled {
        background: color.mix($background-color, $mix-color, 85%);
      }
    }
    &:active {
      @include mixins.not-disabled {
        background: color.mix($background-color, $mix-color, 75%);
      }
    }
  }

  @include mixins.button-reset;
  & {
    border-radius: 4px;
    padding-block: 8px;
    padding-inline: 16px;
    text-align: center;
    user-select: none;
    -webkit-app-region: no-drag;
  }

  @include mixins.keyboard-mode {
    @include focus-box-shadow(
      variables.$color-white,
      variables.$color-ultramarine
    );
  }

  @include mixins.dark-keyboard-mode {
    @include focus-box-shadow(
      variables.$color-black,
      variables.$color-ultramarine
    );
  }

  @include mixins.disabled {
    cursor: not-allowed;
  }

  &--large {
    @include mixins.font-title-2;
    font-weight: bold;
  }

  &--medium {
    @include mixins.font-body-1-bold;
  }

  &--small {
    @include mixins.font-body-2;
    @include mixins.rounded-corners;
    padding-block: 6px;
    padding-inline: 12px;
  }

  &--primary {
    $color: variables.$color-white;
    $background-color: variables.$color-ultramarine;

    color: $color;
    background: $background-color;

    @include mixins.disabled {
      color: color.adjust($color, $alpha: -0.4);
      background: color.adjust($background-color, $alpha: -0.6);
    }

    &--discouraged {
      @include mixins.light-theme {
        opacity: 0.4;
      }
      @include mixins.dark-theme {
        opacity: 0.5;
      }
    }

    @include mixins.light-theme {
      @include hover-and-active-states(
        $background-color,
        variables.$color-black
      );
    }

    @include mixins.dark-theme {
      @include hover-and-active-states(
        $background-color,
        variables.$color-white
      );
    }
  }

  &--secondary {
    @include mixins.light-theme {
      $color: variables.$color-gray-90;
      $background-color: variables.$color-gray-05;

      color: $color;
      background: $background-color;

      @include mixins.disabled {
        color: variables.$color-black-alpha-40;
        background: color.adjust($background-color, $alpha: -0.6);
      }

      &--affirmative {
        color: variables.$color-ultramarine;
      }
      &--affirmative--discouraged {
        color: color.adjust(variables.$color-ultramarine, $alpha: -0.5);
      }

      &--destructive {
        color: variables.$color-accent-red;
      }
      &--destructive--discouraged {
        color: color.adjust(variables.$color-ultramarine, $alpha: -0.5);
      }

      @include hover-and-active-states(
        $background-color,
        variables.$color-black
      );
    }

    @include mixins.dark-theme {
      $color: variables.$color-gray-05;
      $background-color: variables.$color-gray-65;

      color: $color;
      background: $background-color;

      @include mixins.disabled {
        color: variables.$color-white-alpha-20;
        background: color.adjust($background-color, $alpha: -0.6);
      }

      &--affirmative {
        color: variables.$color-ultramarine-light;
      }
      &--affirmative--discouraged {
        color: color.adjust(variables.$color-ultramarine-light, $alpha: -0.5);
      }

      &--destructive {
        color: variables.$color-accent-red;
      }
      &--destructive--discouraged {
        color: color.adjust(variables.$color-accent-red, $alpha: -0.5);
      }

      @include hover-and-active-states(
        $background-color,
        variables.$color-white
      );
    }
  }

  &--destructive {
    $color: variables.$color-white;
    $background-color: variables.$color-accent-red;

    color: $color;
    background: $background-color;

    @include mixins.disabled {
      color: color.adjust($color, $alpha: -0.4);
      background: color.adjust($background-color, $alpha: -0.6);
    }

    @include mixins.light-theme {
      @include hover-and-active-states(
        $background-color,
        variables.$color-black
      );
    }

    @include mixins.dark-theme {
      @include hover-and-active-states(
        $background-color,
        variables.$color-white
      );
    }
  }

  &--calling {
    $color: variables.$color-white;
    $background-color: variables.$color-accent-green;

    @include mixins.rounded-corners;
    color: $color;
    background: $background-color;

    @include mixins.disabled {
      color: color.adjust($color, $alpha: -0.4);
      background: color.adjust($background-color, $alpha: -0.6);
    }

    &--discouraged {
      @include mixins.light-theme {
        opacity: 0.4;
      }
      @include mixins.dark-theme {
        opacity: 0.5;
      }
    }

    @include mixins.light-theme {
      @include hover-and-active-states(
        $background-color,
        variables.$color-black
      );
    }

    @include mixins.dark-theme {
      @include hover-and-active-states(
        $background-color,
        variables.$color-white
      );
    }
  }

  &--system-message {
    @include mixins.rounded-corners;

    &.module-Button--small {
      padding-top: 5px;
      padding-bottom: 5px;
      font-weight: 500;
    }

    @include mixins.light-theme {
      $color: variables.$color-ultramarine;
      $background-color: variables.$color-gray-02;

      color: $color;
      background: $background-color;

      @include mixins.disabled {
        color: color.adjust($color, $alpha: -0.4);
        background: color.adjust($background-color, $alpha: -0.6);
      }
      &--discouraged {
        color: color.adjust($color, $alpha: -0.5);
      }

      @include hover-and-active-states(
        $background-color,
        variables.$color-black
      );
    }

    @include mixins.dark-theme {
      $color: variables.$color-white;
      $background-color: variables.$color-gray-65;

      color: $color;
      background: $background-color;

      @include mixins.disabled {
        color: color.adjust($color, $alpha: -0.4);
        background: color.adjust($background-color, $alpha: -0.6);
      }
      &--discouraged {
        color: color.adjust($color, $alpha: -0.5);
      }

      @include hover-and-active-states(
        $background-color,
        variables.$color-white
      );
    }
  }

  &--details {
    align-items: center;
    border-radius: 8px;
    display: flex;
    flex-direction: column;
    font-size: 11px;
    justify-content: center;
    line-height: 10px;
    min-height: 44px;
    min-width: 68px;
    padding: 8px;

    &--discouraged {
      @include mixins.light-theme {
        opacity: 0.4;
      }
      @include mixins.dark-theme {
        opacity: 0.5;
      }
    }

    @include mixins.light-theme {
      background-color: variables.$color-gray-05;
      color: variables.$color-black;
    }

    @include mixins.dark-theme {
      background-color: variables.$color-gray-65;
      color: variables.$color-gray-05;
    }

    &:focus {
      @include mixins.keyboard-mode {
        box-shadow: 0 0 0 2px variables.$color-ultramarine;
      }
    }

    &::before {
      margin-bottom: 6px;
    }
  }

  &--icon {
    @mixin button-icon($icon) {
      content: '';
      display: block;
      height: 18px;
      width: 18px;

      @include mixins.light-theme {
        @include mixins.color-svg($icon, variables.$color-black);
      }
      @include mixins.dark-theme {
        @include mixins.color-svg($icon, variables.$color-gray-05);
      }
    }

    &--audio::before {
      @include button-icon('../images/icons/v3/phone/phone-compact.svg');
    }

    &--message::before {
      @include button-icon('../images/icons/v3/chat/chat-compact.svg');
    }

    &--muted::before {
      @include button-icon('../images/icons/v3/bell/bell-slash-compact.svg');
    }

    &--search::before {
      @include button-icon('../images/icons/v3/search/search-compact.svg');
    }

    &--unmuted::before {
      @include button-icon('../images/icons/v3/bell/bell-compact.svg');
    }

    &--video::before {
      @include button-icon('../images/icons/v3/video/video-compact.svg');
    }
  }
}
