@use "sass:map";
@use "../utils/helpers" as h;
@use "../utils/variables" as vars;

/* @docs */
$dropdown-disabled-opacity: h.useVar("control-disabled-opacity") !default;

$dropdown-menu-zindex: map.get(vars.$zindex, "dropdown") !default;
$dropdown-menu-spacer: 0px !default;
$dropdown-menu-padding: h.useVar("control-spacer") 0 !default;
$dropdown-menu-box-shadow:
    0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1),
    0 0 0 1px rgba(10, 10, 10, 0.02) !default;
$dropdown-menu-background-color: h.useVar("control-background-color") !default;
$dropdown-menu-border-color: h.useVar("control-border-color") !default;
$dropdown-menu-border-style: solid !default;
$dropdown-menu-border-width: h.useVar("control-border-width") !default;
$dropdown-menu-border-radius: h.useVar("border-radius") !default;

$dropdown-item-padding: 0.25rem 1rem !default;
$dropdown-item-color: h.useVar("font-color") !default;
$dropdown-item-font-size: h.useVar("font-size") !default;
$dropdown-item-font-weight: h.useVar("font-weight") !default;
$dropdown-item-line-height: h.useVar("line-height") !default;

$dropdown-item-background-color: transparent !default;
$dropdown-item-active-color: h.useVar("primary-invert") !default;
$dropdown-item-active-background-color: h.useVar("primary") !default;
$dropdown-item-hover-background-color: h.useVar("grey-lighter") !default;
$dropdown-item-hover-color: h.useVar("font-color") !default;

$dropdown-modal-zindex: map.get(vars.$zindex, "modal") !default;
$dropdown-modal-max-height: min(50vh, calc(100vh - 160px)) !default;
$dropdown-modal-max-width: min(50vw, calc(100vw - 160px)) !default;
$dropdown-modal-min-width: min(80vw, 400px) !default;

$dropdown-overlay-background-color: h.useVar(
    "overlay-background-color"
) !default;
$dropdown-overlay-zindex: map.get(vars.$zindex, "overlay") !default;
/* @docs */

.o-dropdown {
    @include h.defineVar(
        "dropdown-disabled-opacity",
        $dropdown-disabled-opacity
    );
    @include h.defineVar(
        "dropdown-overlay-background-color",
        $dropdown-overlay-background-color
    );
    @include h.defineVar("dropdown-overlay-zindex", $dropdown-overlay-zindex);

    @include h.defineVar("dropdown-item-color", $dropdown-item-color);
    @include h.defineVar("dropdown-item-font-size", $dropdown-item-font-size);
    @include h.defineVar(
        "dropdown-item-font-weight",
        $dropdown-item-font-weight
    );
    @include h.defineVar(
        "dropdown-item-line-height",
        $dropdown-item-line-height
    );
    @include h.defineVar("dropdown-item-padding", $dropdown-item-padding);
    @include h.defineVar(
        "dropdown-item-background-color",
        $dropdown-item-background-color
    );
    @include h.defineVar(
        "dropdown-item-active-color",
        $dropdown-item-active-color
    );
    @include h.defineVar(
        "dropdown-item-active-background-color",
        $dropdown-item-active-background-color
    );
    @include h.defineVar(
        "dropdown-item-hover-color",
        $dropdown-item-hover-color
    );
    @include h.defineVar(
        "dropdown-item-hover-background-color",
        $dropdown-item-hover-background-color
    );

    @include h.defineVar("dropdown-menu-zindex", $dropdown-menu-zindex);
    @include h.defineVar("dropdown-menu-spacer", $dropdown-menu-spacer);
    @include h.defineVar("dropdown-menu-box-shadow", $dropdown-menu-box-shadow);
    @include h.defineVar("dropdown-menu-padding", $dropdown-menu-padding);
    @include h.defineVar(
        "dropdown-menu-background-color",
        $dropdown-menu-background-color
    );
    @include h.defineVar(
        "dropdown-menu-border-style",
        $dropdown-menu-border-style
    );
    @include h.defineVar(
        "dropdown-menu-border-color",
        $dropdown-menu-border-color
    );
    @include h.defineVar(
        "dropdown-menu-border-width",
        $dropdown-menu-border-width
    );
    @include h.defineVar(
        "dropdown-menu-border-radius",
        $dropdown-menu-border-radius
    );

    display: inline-flex;
    position: relative;
    vertical-align: top;

    &__trigger {
        display: inline-flex;
        width: 100%;
    }

    &__menu {
        position: absolute;
        display: block;
        width: max-content;
        min-width: 100%;

        z-index: h.useVar("dropdown-menu-zindex");
        padding: h.useVar("dropdown-menu-padding");

        box-shadow: h.useVar("dropdown-menu-box-shadow");
        background-color: h.useVar("dropdown-menu-background-color");
        border-color: h.useVar("dropdown-menu-border-color");
        border-style: h.useVar("dropdown-menu-border-style");
        border-width: h.useVar("dropdown-menu-border-width");
        border-radius: h.useVar("dropdown-menu-border-radius");

        // position variants
        &--bottom {
            left: 50%;
            right: auto;
            top: calc(100% + h.useVar("dropdown-menu-spacer"));
            bottom: auto;
            transform: translateX(-50%);
        }

        &--top {
            left: 50%;
            right: auto;
            top: auto;
            bottom: calc(100% + h.useVar("dropdown-menu-spacer"));
            transform: translateX(-50%);
        }

        &--left {
            right: calc(100% + h.useVar("dropdown-menu-spacer"));
            left: auto;
            top: 50%;
            bottom: auto;
            transform: translateY(-50%);
        }

        &--right {
            right: auto;
            left: calc(100% + h.useVar("dropdown-menu-spacer"));
            top: 50%;
            bottom: auto;
            transform: translateY(-50%);
        }

        &--top-right {
            right: 0;
            left: auto;
            top: auto;
            bottom: calc(100% + h.useVar("dropdown-menu-spacer"));
        }

        &--top-left {
            right: auto;
            left: 0;
            top: auto;
            bottom: calc(100% + h.useVar("dropdown-menu-spacer"));
        }

        &--bottom-right {
            right: 0;
            left: auto;
            top: calc(100% + h.useVar("dropdown-menu-spacer"));
            bottom: auto;
        }

        &--bottom-left {
            right: auto;
            left: 0;
            top: calc(100% + h.useVar("dropdown-menu-spacer"));
            bottom: auto;
        }
    }

    &__item {
        display: block;
        position: relative;

        padding: h.useVar("dropdown-item-padding");

        color: h.useVar("dropdown-item-color");
        font-size: h.useVar("dropdown-item-font-size");
        font-weight: h.useVar("dropdown-item-font-weight");
        line-height: h.useVar("dropdown-item-line-height");

        background-color: h.useVar("dropdown-item-background-color");

        &--disabled {
            @include h.disabled(h.useVar("dropdown-disabled-opacity"));
        }

        &--active {
            @include h.defineVar(
                "dropdown-item-color",
                h.useVar("dropdown-item-active-color")
            );
            @include h.defineVar(
                "dropdown-item-background-color",
                h.useVar("dropdown-item-active-background-color")
            );
        }

        &--clickable {
            @include h.clickable;
        }

        &--clickable:not(&--active) {
            &:hover,
            &.o-dropdown__item--focused {
                @include h.defineVar(
                    "dropdown-item-color",
                    h.useVar("dropdown-item-hover-color")
                );
                @include h.defineVar(
                    "dropdown-item-background-color",
                    h.useVar("dropdown-item-hover-background-color")
                );
            }
        }
    }

    &--inline {
        display: inline;

        .o-dropdown__menu {
            position: static;
            display: inline-block;
            padding: 0;
        }
    }

    &--expanded {
        width: 100%;

        .o-dropdown__menu {
            width: 100%;
        }
    }

    &--disabled {
        @include h.disabled(h.useVar("dropdown-disabled-opacity"));
    }

    &--teleport {
        width: unset;
    }

    &--modal {
        @include h.defineVar("dropdown-modal-zindex", $dropdown-modal-zindex);
        @include h.defineVar(
            "dropdown-modal-max-height",
            $dropdown-modal-max-height
        );
        @include h.defineVar(
            "dropdown-modal-min-width",
            $dropdown-modal-min-width
        );
        @include h.defineVar(
            "dropdown-modal-max-width",
            $dropdown-modal-max-width
        );

        > .o-dropdown__overlay {
            pointer-events: auto;
            position: fixed;
            bottom: 0;
            left: 0;
            right: 0;
            top: 0;
            background-color: h.useVar("dropdown-overlay-background-color");
            z-index: h.useVar("dropdown-overlay-zindex");
        }

        > .o-dropdown__menu {
            pointer-events: auto;
            position: fixed;
            top: 25%;
            left: 50%;
            bottom: unset;
            right: unset;
            transform: translate3d(-50%, -25%, 0);

            min-width: h.useVar("dropdown-modal-min-width");
            max-width: h.useVar("dropdown-modal-max-width");
            max-height: h.useVar("dropdown-modal-max-height");
            z-index: h.useVar("dropdown-modal-zindex");
        }
    }
}
