/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

@use 'sass:map';
@use '@angular/material' as mat;

@mixin generate-theme($material-theme, $supplemental-theme) {
    // Get the color config from the theme.
    $material-theme-color-config: mat.get-color-config($material-theme);
    $supplemental-theme-color-config: mat.get-color-config($supplemental-theme);

    // Get the color palette from the color-config.
    $material-theme-primary-palette: map.get($material-theme-color-config, 'primary');
    $supplemental-theme-surface-palette: map.get($supplemental-theme-color-config, 'primary');

    // Get hues from palette
    $is-dark: map-get($material-theme-color-config, is-dark);
    $material-theme-primary-palette-default: mat.get-color-from-palette($material-theme-primary-palette);
    $material-theme-primary-palette-lighter: mat.get-color-from-palette($material-theme-primary-palette, lighter);
    $material-theme-primary-palette-darker: mat.get-color-from-palette($material-theme-primary-palette, darker);
    $supplemental-theme-surface-palette-darker: mat.get-color-from-palette($supplemental-theme-surface-palette, darker);
    $supplemental-theme-surface-palette-lighter: mat.get-color-from-palette(
        $supplemental-theme-surface-palette,
        lighter
    );

    $hover: var(--mat-menu-item-hover-state-layer-color);

    .new-canvas-item {
        .icon {
            &.hovering {
                @extend .mat-elevation-z2;

                // This solution re-uses the highlight value used throughout the UI, but because we need to hide the non-hover
                // version of the icons, we create a double layered gradient with the matching background color of the
                // navigation bar, then put the highlight on top of it.
                background: linear-gradient($hover, $hover),
                    linear-gradient(
                        $supplemental-theme-surface-palette-lighter,
                        $supplemental-theme-surface-palette-lighter
                    ) !important;

                .component-button-grip {
                    background: repeating-linear-gradient(
                        90deg,
                        if(
                            $is-dark,
                            $supplemental-theme-surface-palette-darker,
                            $supplemental-theme-surface-palette-lighter
                        ),
                        $material-theme-primary-palette-default 4px,
                        transparent 4px,
                        transparent 6px
                    );
                }
            }

            &.cdk-drag-dragging {
                color: if($is-dark, $material-theme-primary-palette-lighter, $material-theme-primary-palette-darker);
                mix-blend-mode: difference; // Make sure the dragged icon is always visible
            }
        }

        .icon:disabled {
            cursor: not-allowed;
        }
    }
}
