@use 'sass:map';
@use 'sass:meta';

@use 'components-theming' as *;

@function kbq-contrast($palette, $hue) {
    @return map.get(map.get($palette, contrast), $hue);
}

@function kbq-palette($base-palette, $default) {
    $result: map.merge(
        $base-palette,
        (
            default: $default
        )
    );

    // For each hue in the palette, add a "-contrast" color to the map.
    @each $hue, $color in $base-palette {
        $result: map.merge(
            $result,
            (
                '#{$hue}-contrast': kbq-contrast($base-palette, $hue)
            )
        );
    }

    @return $result;
}

@function kbq-color($palette, $hue: default, $opacity: null) {
    // If hueKey is a number between zero and one, then it actually contains an
    // opacity value, so recall this function with the default hue and that given opacity.
    @if meta.type-of($hue) == number and $hue >= 0 and $hue <= 1 {
        @return kbq-color($palette, default, $hue);
    }

    $color: map.get($palette, $hue);
    $opacity: if($opacity == null, opacity($color), $opacity);

    @return rgba($color, $opacity);
}

// Mixin that renders all of the core styles that depend on the theme.

@mixin kbq-core-theme($theme: null) {
    .kbq-app-background {
        background: var(--kbq-background-bg);
        color: var(--kbq-foreground-contrast);
    }
}

@function _theme_foreground($tokens, $scheme) {
    @return (
        white: map.get($tokens, '#{$scheme}-foreground-white'),
        white-secondary: map.get($tokens, '#{$scheme}-foreground-white-secondary'),
        theme: map.get($tokens, '#{$scheme}-foreground-theme'),
        theme-secondary: map.get($tokens, '#{$scheme}-foreground-theme-secondary'),
        on-contrast: map.get($tokens, '#{$scheme}-foreground-on-contrast'),
        contrast: map.get($tokens, '#{$scheme}-foreground-contrast'),
        contrast-secondary: map.get($tokens, '#{$scheme}-foreground-contrast-secondary'),
        contrast-tertiary: map.get($tokens, '#{$scheme}-foreground-contrast-tertiary'),
        success: map.get($tokens, '#{$scheme}-foreground-success'),
        // будет удалено, после удаления из компонентов ↓
        success-less: map.get($tokens, '#{$scheme}-foreground-success-less'),
        success-secondary: map.get($tokens, '#{$scheme}-foreground-success-secondary'),
        warning: map.get($tokens, '#{$scheme}-foreground-warning'),
        warning-secondary: map.get($tokens, '#{$scheme}-foreground-warning-secondary'),
        error: map.get($tokens, '#{$scheme}-foreground-error'),
        error-secondary: map.get($tokens, '#{$scheme}-foreground-error-secondary'),
        error-tertiary: map.get($tokens, '#{$scheme}-foreground-error-tertiary'),
        visited: map.get($tokens, '#{$scheme}-foreground-visited'),
        // будет удалено, после удаления из компонентов ↓
        error-less: map.get($tokens, '#{$scheme}-foreground-error-less')
    );
}

@function _theme_background($tokens, $scheme) {
    @return (
        bg: map.get($tokens, '#{$scheme}-background-bg'),
        bg-secondary: map.get($tokens, '#{$scheme}-background-bg-secondary'),
        bg-tertiary: map.get($tokens, '#{$scheme}-background-bg-tertiary'),
        card: map.get($tokens, '#{$scheme}-background-card'),
        contrast: map.get($tokens, '#{$scheme}-background-contrast'),
        contrast-fade: map.get($tokens, '#{$scheme}-background-contrast-fade'),
        night: map.get($tokens, '#{$scheme}-background-night'),
        error: map.get($tokens, '#{$scheme}-background-error'),
        error-fade: map.get($tokens, '#{$scheme}-background-error-fade'),
        error-less: map.get($tokens, '#{$scheme}-background-error-less'),
        success: map.get($tokens, '#{$scheme}-background-success'),
        success-fade: map.get($tokens, '#{$scheme}-background-success-fade'),
        theme: map.get($tokens, '#{$scheme}-background-theme'),
        theme-fade: map.get($tokens, '#{$scheme}-background-theme-fade'),
        warning: map.get($tokens, '#{$scheme}-background-warning'),
        warning-fade: map.get($tokens, '#{$scheme}-background-warning-fade'),
        transparent: map.get($tokens, '#{$scheme}-background-transparent'),
        overlay: map.get($tokens, '#{$scheme}-background-overlay'),
        overlay-inverse: map.get($tokens, '#{$scheme}-background-overlay-inverse')
    );
}

@function _theme_icon($tokens, $scheme) {
    @return (
        on-contrast: map.get($tokens, '#{$scheme}-icon-on-contrast'),
        white: map.get($tokens, '#{$scheme}-icon-white'),
        theme: map.get($tokens, '#{$scheme}-icon-theme'),
        contrast: map.get($tokens, '#{$scheme}-icon-contrast'),
        contrast-fade: map.get($tokens, '#{$scheme}-icon-contrast-fade'),
        contrast-fade-hover: map.get($tokens, '#{$scheme}-icon-contrast-fade-hover'),
        success: map.get($tokens, '#{$scheme}-icon-success'),
        warning: map.get($tokens, '#{$scheme}-icon-warning'),
        error: map.get($tokens, '#{$scheme}-icon-error'),
        visited: map.get($tokens, '#{$scheme}-icon-visited')
    );
}

@function _theme_line($tokens, $scheme) {
    @return (
        theme: map.get($tokens, '#{$scheme}-line-theme'),
        theme-fade: map.get($tokens, '#{$scheme}-line-theme-fade'),
        contrast: map.get($tokens, '#{$scheme}-line-contrast'),
        contrast-fade: map.get($tokens, '#{$scheme}-line-contrast-fade'),
        contrast-less: map.get($tokens, '#{$scheme}-line-contrast-less'),
        success: map.get($tokens, '#{$scheme}-line-success'),
        success-fade: map.get($tokens, '#{$scheme}-line-success-fade'),
        warning: map.get($tokens, '#{$scheme}-line-warning'),
        warning-fade: map.get($tokens, '#{$scheme}-line-warning-fade'),
        error: map.get($tokens, '#{$scheme}-line-error'),
        error-fade: map.get($tokens, '#{$scheme}-line-error-fade'),
        visited: map.get($tokens, '#{$scheme}-line-visited')
    );
}

@function _theme_states-background($tokens, $scheme) {
    @return (
        disabled: map.get($tokens, '#{$scheme}-states-background-disabled'),
        transparent-hover: map.get($tokens, '#{$scheme}-states-background-transparent-hover'),
        transparent-active: map.get($tokens, '#{$scheme}-states-background-transparent-active'),
        contrast-hover: map.get($tokens, '#{$scheme}-states-background-contrast-hover'),
        contrast-active: map.get($tokens, '#{$scheme}-states-background-contrast-active'),
        contrast-fade-hover: map.get($tokens, '#{$scheme}-states-background-contrast-fade-hover'),
        contrast-fade-active: map.get($tokens, '#{$scheme}-states-background-contrast-fade-active'),
        theme-hover: map.get($tokens, '#{$scheme}-states-background-theme-hover'),
        theme-active: map.get($tokens, '#{$scheme}-states-background-theme-active'),
        theme-fade-hover: map.get($tokens, '#{$scheme}-states-background-theme-fade-hover'),
        theme-fade-active: map.get($tokens, '#{$scheme}-states-background-theme-fade-active'),
        error-hover: map.get($tokens, '#{$scheme}-states-background-error-hover'),
        error-active: map.get($tokens, '#{$scheme}-states-background-error-active'),
        error-fade-hover: map.get($tokens, '#{$scheme}-states-background-error-fade-hover'),
        error-fade-active: map.get($tokens, '#{$scheme}-states-background-error-fade-active')
    );
}

@function _theme_states-foreground($tokens, $scheme) {
    @return (
        disabled: map.get($tokens, '#{$scheme}-states-foreground-disabled'),
        theme-hover: map.get($tokens, '#{$scheme}-states-foreground-theme-hover'),
        theme-active: map.get($tokens, '#{$scheme}-states-foreground-theme-active'),
        visited-hover: map.get($tokens, '#{$scheme}-states-foreground-visited-hover'),
        visited-active: map.get($tokens, '#{$scheme}-states-foreground-visited-active')
    );
}

@function _theme_states-icon($tokens, $scheme) {
    @return (
        theme-hover: map.get($tokens, '#{$scheme}-states-icon-theme-hover'),
        theme-active: map.get($tokens, '#{$scheme}-states-icon-theme-active'),
        contrast-hover: map.get($tokens, '#{$scheme}-states-icon-contrast-hover'),
        contrast-active: map.get($tokens, '#{$scheme}-states-icon-contrast-active'),
        contrast-fade-hover: map.get($tokens, '#{$scheme}-states-icon-contrast-fade-hover'),
        contrast-fade-active: map.get($tokens, '#{$scheme}-states-icon-contrast-fade-active'),
        error-hover: map.get($tokens, '#{$scheme}-states-icon-error-hover'),
        error-active: map.get($tokens, '#{$scheme}-states-icon-error-active'),
        success-hover: map.get($tokens, '#{$scheme}-states-icon-success-hover'),
        success-active: map.get($tokens, '#{$scheme}-states-icon-success-active'),
        disabled: map.get($tokens, '#{$scheme}-states-icon-disabled'),
        warning-hover: map.get($tokens, '#{$scheme}-states-icon-warning-hover'),
        warning-active: map.get($tokens, '#{$scheme}-states-icon-warning-active'),
        visited-hover: map.get($tokens, '#{$scheme}-states-icon-visited-hover'),
        visited-active: map.get($tokens, '#{$scheme}-states-icon-visited-active')
    );
}

@function _theme_states-line($tokens, $scheme) {
    @return (
        focus: map.get($tokens, '#{$scheme}-states-line-focus'),
        focus-theme: map.get($tokens, '#{$scheme}-states-line-focus-theme'),
        focus-error: map.get($tokens, '#{$scheme}-states-line-focus-error'),
        disabled: map.get($tokens, '#{$scheme}-states-line-disabled')
    );
}

@function _theme_states($tokens, $scheme) {
    @return (
        background: _theme_states-background($tokens, $scheme),
        foreground: _theme_states-foreground($tokens, $scheme),
        icon: _theme_states-icon($tokens, $scheme),
        line: _theme_states-line($tokens, $scheme),
        // будет удалено, после удаления из компонентов ↓
        disabled-opacity: map.get($tokens, '#{$scheme}-states-disabled-opacity')
    );
}

@function kbq-palette($base-palette, $default) {
    @return map.merge(
        $base-palette,
        (
            default: $default
        )
    );
}

@function _theme_palette($tokens, $scheme, $name) {
    @return kbq-palette(
        map.get($tokens, '#{$scheme}-#{$name}-palette'),
        map.get($tokens, '#{$scheme}-#{$name}-default')
    );
}

@function kbq-light-theme($tokens) {
    $scheme: 'light';

    @return (
        is-dark: false,

        background: _theme_background($tokens, $scheme),
        foreground: _theme_foreground($tokens, $scheme),
        icon: _theme_icon($tokens, $scheme),
        line: _theme_line($tokens, $scheme),
        states: _theme_states($tokens, $scheme),
        theme: _theme_palette($tokens, $scheme, theme),
        success: _theme_palette($tokens, $scheme, success),
        warning: _theme_palette($tokens, $scheme, warning),
        error: _theme_palette($tokens, $scheme, error),
        contrast: _theme_palette($tokens, $scheme, contrast),
        white: _theme_palette($tokens, $scheme, white),
        black: _theme_palette($tokens, $scheme, black),
        purple: _theme_palette($tokens, $scheme, purple),
        components: kbq-components-theme($tokens, $scheme),
        tokens: $tokens
    );
}

@function kbq-dark-theme($tokens) {
    $scheme: 'dark';

    @return (
        is-dark: true,

        background: _theme_background($tokens, $scheme),
        foreground: _theme_foreground($tokens, $scheme),
        icon: _theme_icon($tokens, $scheme),
        line: _theme_line($tokens, $scheme),
        states: _theme_states($tokens, $scheme),
        theme: _theme_palette($tokens, $scheme, theme),
        success: _theme_palette($tokens, $scheme, success),
        warning: _theme_palette($tokens, $scheme, warning),
        error: _theme_palette($tokens, $scheme, error),
        contrast: _theme_palette($tokens, $scheme, contrast),
        white: _theme_palette($tokens, $scheme, white),
        black: _theme_palette($tokens, $scheme, black),
        purple: _theme_palette($tokens, $scheme, purple),
        components: kbq-components-theme($tokens, $scheme),
        tokens: $tokens
    );
}
