@use "sass:map";
@use "sass:math";
@use "../../color-system/_constants.scss" as *;
@use "../../functions/index.scss" as *;
@use "../../mixins/index.scss" as *;
@use "../../z-index/index.scss" as *;
@use "../../motion/index.scss" as *;
@use "./variables.scss" as *;

@mixin kendo-calendar--layout-base() {

    // Base
    .k-calendar {
        inline-size: var( --INTERNAL--kendo-calendar-width, min-content );
        block-size: var( --INTERNAL--kendo-calendar-height, min-content );
        border-width: $kendo-calendar-border-width;
        border-style: solid;
        border-radius: $kendo-calendar-border-radius;
        box-sizing: border-box;
        outline: 0;
        font-family: $kendo-calendar-font-family;
        position: relative;
        overflow: hidden;
        display: inline-flex;
        flex-flow: column nowrap;
        user-select: none;
        -webkit-touch-callout: none;
        -webkit-tap-highlight-color: $kendo-color-rgba-transparent;


        // Nested calendar
        > .k-calendar {
            border: 0;
        }

        // Calendar sizes
        @each $size, $size-props in $kendo-calendar-sizes {
            $_font-size: map.get( $size-props, font-size );
            $_line-height: map.get( $size-props, line-height );
            $_cell-size: map.get( $size-props, cell-size );
            $_cell-padding-x: map.get( $size-props, cell-padding-x );
            $_cell-padding-y: map.get( $size-props, cell-padding-y );

            $_month-cell-size: $_cell-size;
            $_year-cell-size: calc( 2 * #{$_cell-size} );
            $_decade-cell-size: calc( 2 * #{$_cell-size} );
            $_century-cell-size: calc( 2 * #{$_cell-size} );

            #{k-when-default($kendo-calendar-default-size, $size)}
            &.k-calendar-#{$size} {
                --INTERNAL--kendo-calendar-view-width: calc( 8 * #{$_cell-size} );
                --INTERNAL--kendo-calendar-cell-padding-x: var( --kendo-calendar-#{$size}-cell-padding-x, #{$_cell-padding-x} );
                --INTERNAL--kendo-calendar-cell-padding-y: var( --kendo-calendar-#{$size}-cell-padding-y, #{$_cell-padding-y} );
                font-size: $_font-size;
                line-height: $_line-height;

                &.k-month-calendar,
                .k-calendar-monthview {
                    --INTERNAL--kendo-calendar-cell-size: var( --kendo-calendar-#{$size}-month-cell-size, #{$_month-cell-size} );
                }
                &.k-year-calendar,
                .k-calendar-yearview {
                    --INTERNAL--kendo-calendar-cell-size: var( --kendo-calendar-#{$size}-year-cell-size, #{$_year-cell-size} );
                }
                &.k-decade-calendar,
                .k-calendar-decadeview {
                    --INTERNAL--kendo-calendar-cell-size: var( --kendo-calendar-#{$size}-decade-cell-size, #{$_decade-cell-size} );
                }
                &.k-century-calendar,
                .k-calendar-centuryview {
                    --INTERNAL--kendo-calendar-cell-size: var( --kendo-calendar-#{$size}-century-cell-size, #{$_century-cell-size} );
                }
            }
        }

        font-size: $kendo-calendar-font-size;
        line-height: $kendo-calendar-line-height;
    }


    // Calendar table
    .k-calendar-table {
        margin-block: 0;
        margin-inline: auto;
        border-width: 0;
        border-color: inherit;
        border-spacing: 0;
        border-collapse: separate;
        table-layout: fixed;
        text-align: center;
        outline: 0;
        display: table;
        position: relative;
        z-index: k-z-index("base", 1);
    }
    .k-calendar-caption,
    .k-calendar-caption.k-calendar-th,
    .k-calendar .k-meta-header,
    .k-calendar .k-month-header {
        padding-block: $kendo-calendar-caption-padding-y;
        padding-inline: $kendo-calendar-caption-padding-x;
        height: $kendo-calendar-caption-height;
        box-sizing: border-box;
        font-size: $kendo-calendar-caption-font-size;
        line-height: $kendo-calendar-caption-line-height;
        text-transform: none;
        text-align: start;
        font-weight: $kendo-calendar-caption-font-weight;
        cursor: default;
    }


    // Calendar cell
    .k-calendar-th,
    .k-calendar-td {
        border-width: 0;
        padding: 0;
        text-align: center;
        border-style: solid;
        border-color: inherit;
        font-weight: normal;
        cursor: default;
    }
    .k-calendar-th {
        padding-block: $kendo-calendar-header-cell-padding-y;
        padding-inline: $kendo-calendar-header-cell-padding-x;
        inline-size: var( --INTERNAL--kendo-calendar-cell-size, $kendo-calendar-header-cell-width );
        block-size: var( --INTERNAL--kendo-calendar-cell-size, $kendo-calendar-header-cell-height );
        font-size: $kendo-calendar-header-cell-font-size;
        line-height: $kendo-calendar-header-cell-line-height;
        text-transform: uppercase;
        opacity: $kendo-calendar-header-cell-opacity;
    }
    .k-calendar-td {
        @include border-radius( $kendo-calendar-cell-border-radius );
        inline-size: var( --INTERNAL--kendo-calendar-cell-size, min-content );
        block-size: var( --INTERNAL--kendo-calendar-cell-size, min-content );
        border-color: transparent;
    }
    .k-calendar-td.k-alt {
        font-size: $kendo-calendar-week-number-font-size;
    }


    // Calendar cell inner
    // Remove .k-calendar once we remove k-link
    .k-calendar .k-calendar-cell-inner {
        @include border-radius( $kendo-calendar-cell-border-radius );
        padding-inline: var( --INTERNAL--kendo-calendar-cell-padding-x, #{$kendo-calendar-cell-padding-x} );
        padding-block: var( --INTERNAL--kendo-calendar-cell-padding-y, #{$kendo-calendar-cell-padding-y} );
        width: 100%;
        height: 100%;
        box-sizing: border-box;
        display: flex;
        flex-direction: row;
        align-items: center;
        justify-content: center;
        white-space: normal;
        position: relative;
        overflow: hidden;
        transition: color k-transition(rapid), background-color k-transition(rapid), border-color k-transition(rapid), box-shadow k-transition(rapid);
    }


    // Calendar header
    .k-calendar .k-header {
        padding-block: $kendo-calendar-header-padding-y;
        padding-inline: $kendo-calendar-header-padding-x;
        border-block-end-width: $kendo-calendar-header-border-width;
        border-block-end-style: solid;
        display: flex;
        flex-flow: row nowrap;
        gap: $kendo-calendar-nav-gap;
        align-items: center;
        position: relative;
        z-index: k-z-index("base", 2);
    }


    // Calendar header
    .k-calendar-header {
        padding-block: $kendo-calendar-header-padding-y;
        padding-inline: $kendo-calendar-header-padding-x;
        min-width: var( --INTERNAL--kendo-calendar-view-width, #{$kendo-calendar-view-width});
        box-sizing: border-box;
        display: flex;
        align-items: center;
        justify-content: space-between;
        flex: 0 0 auto;

        .k-calendar-nav {
            display: flex;
            flex-flow: row nowrap;
            align-items: center;
            gap: $kendo-calendar-nav-gap;
        }
    }


    // Calendar footer
    .k-calendar-footer,
    .k-calendar .k-footer {
        padding-block: $kendo-calendar-footer-padding-y;
        padding-inline: $kendo-calendar-footer-padding-x;
        text-align: center;
        clear: both;
    }


    // Calendar view wrapper
    .k-calendar-view {
        margin: auto;
        padding-block: 0;
        padding-inline: $kendo-calendar-header-padding-x;
        // setting width / height prevents layout changes in meta views
        width: var( --INTERNAL--kendo-calendar-view-width, #{$kendo-calendar-view-width});
        inline-size: var( --INTERNAL--kendo-calendar-view-width, #{$kendo-calendar-view-width});
        min-height: $kendo-calendar-view-height;
        box-sizing: content-box;
        gap: $kendo-calendar-view-gap;
        position: relative;
        z-index: k-z-index("base", 1);
        overflow: hidden;

        .k-today {
            font-weight: $kendo-calendar-today-font-weight;
            box-shadow: $kendo-calendar-today-box-shadow;
        }
    }


    // Month view
    .k-month-calendar,
    .k-calendar-monthview {
        $_month-cell-size: $kendo-calendar-cell-size;

        .k-calendar-td {
            width: var( --INTERNAL--kendo-calendar-cell-size, #{$_month-cell-size} );
            height: var( --INTERNAL--kendo-calendar-cell-size, #{$_month-cell-size} );
            inline-size: var( --INTERNAL--kendo-calendar-cell-size, #{$_month-cell-size} );
            block-size: var( --INTERNAL--kendo-calendar-cell-size, #{$_month-cell-size} );
        }
    }


    // Year view
    .k-year-calendar,
    .k-calendar-yearview {
        $_year-cell-size: calc( 2 * #{$kendo-calendar-cell-size} );

        .k-calendar-td {
            width: var( --INTERNAL--kendo-calendar-cell-size, #{$_year-cell-size} );
            height: var( --INTERNAL--kendo-calendar-cell-size, #{$_year-cell-size} );
            inline-size: var( --INTERNAL--kendo-calendar-cell-size, #{$_year-cell-size} );
            block-size: var( --INTERNAL--kendo-calendar-cell-size, #{$_year-cell-size} );
        }
    }


    // Decade view
    .k-decade-calendar,
    .k-calendar-decadeview {
        $_decade-cell-size: calc( 2 * #{$kendo-calendar-cell-size} );

        .k-calendar-td {
            width: var( --INTERNAL--kendo-calendar-cell-size, #{$_decade-cell-size} );
            height: var( --INTERNAL--kendo-calendar-cell-size, #{$_decade-cell-size} );
            inline-size: var( --INTERNAL--kendo-calendar-cell-size, #{$_decade-cell-size} );
            block-size: var( --INTERNAL--kendo-calendar-cell-size, #{$_decade-cell-size} );
        }
    }


    // Century view
    .k-century-calendar,
    .k-calendar-centuryview {
        $_century-cell-size: calc( 2 * #{$kendo-calendar-cell-size} );

        .k-calendar-td {
            width: var( --INTERNAL--kendo-calendar-cell-size, #{$_century-cell-size} );
            height: var( --INTERNAL--kendo-calendar-cell-size, #{$_century-cell-size} );
            inline-size: var( --INTERNAL--kendo-calendar-cell-size, #{$_century-cell-size} );
            block-size: var( --INTERNAL--kendo-calendar-cell-size, #{$_century-cell-size} );
        }
        .k-calendar-cell-inner {
            text-align: start;
        }
    }


    // Calendar in popup
    .k-popup .k-calendar {
        height: 100%;
    }
    .k-calendar-container,
    .k-datetime-container {
        padding: 0;

        .k-calendar {
            border-width: 0;
        }
    }




    .k-calendar .k-content.k-scrollable,
    .k-calendar .k-calendar-content.k-scrollable {
        box-sizing: content-box;
        overflow-x: hidden;
        overflow-y: auto;
        display: block;

        @include hide-scrollbar();
    }

    // scoped in calendar until it is used elsewhere
    .k-calendar .k-scrollable-placeholder {
        position: absolute;
        z-index: k-z-index("bottom");
        width: 1px;
        inset-block-start: 0;
        inset-inline-end: 0;
    }




    // Legacy aliases
    .k-link {
        @extend .k-calendar-cell-inner !optional;
    }


    // Infinite calendar
    .k-calendar-infinite {
        box-sizing: content-box;
        display: inline-flex;
        flex-flow: row nowrap;

        .k-calendar-view {
            padding-block: $kendo-infinite-calendar-view-padding-y;
            padding-inline: $kendo-infinite-calendar-view-padding-x;
            height: $kendo-infinite-calendar-view-height;
            flex: 0 0 auto;
            display: flex;
            flex-flow: column nowrap;
            gap: 0;
            overflow: hidden;

            .k-content.k-scrollable {
                position: relative;
            }

            &::after {
                display: block;
                position: absolute;
                inset-block-end: 0;
                content: "";
                height: 0;
                line-height: 1lh;
                z-index: k-z-index("base", 1);
                width: 150%;
                inset-inline-start: -25%;
                box-shadow: 0 0 $kendo-calendar-cell-size calc( #{$kendo-calendar-cell-size} / 2 ) $kendo-calendar-bg;
            }
        }

        .k-calendar-header {
            margin-inline-start: calc( #{$kendo-infinite-calendar-view-padding-x} * -1 );
            margin-inline-end: calc( #{$kendo-infinite-calendar-view-padding-x} * -1 );
            padding-block: $kendo-infinite-calendar-header-padding-y;
            padding-inline: $kendo-infinite-calendar-header-padding-x;
            width: auto;
            min-width: 0;
        }

        .k-calendar-weekdays {
            flex: 0 0 auto;
        }
    }


    // Calendar navigation
    .k-calendar-navigation {
        width: $kendo-calendar-navigation-width;
        text-align: center;
        flex: 0 0 auto;
        display: block;
        overflow: hidden;
        position: relative;
        z-index: k-z-index("base", 1);

        &::before,
        &::after {
            display: block;
            position: absolute;
            content: "";
            height: 0;
            line-height: 0;
            z-index: k-z-index("base", 1);
            width: 200%;
            inset-inline-start: -50%;
            $shadow-size: calc( 3 * #{$kendo-calendar-navigation-item-height} );
            box-shadow: 0 0 $shadow-size calc( #{$shadow-size} / 2 ) $kendo-calendar-navigation-bg;
        }

        &::before { inset-block-start: 0; }
        &::after { inset-block-end: 0; }

        .k-content,
        .k-calendar-content {
            background: transparent;
            height: auto;
            position: absolute;
            inset-block-start: 0;
            inset-inline-start: 0;
            inset-block-end: 0;
            inset-inline-end: 0;

            ul {
                width: $kendo-calendar-navigation-width;
            }

            li {
                height: $kendo-calendar-navigation-item-height;
                line-height: $kendo-calendar-navigation-item-height;
                cursor: pointer;
                padding-block: 0;
                padding-inline: 1em;
                overflow: hidden;
                white-space: nowrap;
                text-overflow: clip;
            }
        }

        .k-calendar-navigation-marker {
            font-weight: bold;
        }

        .k-calendar-navigation-highlight {
            width: 100%;
            border-width: 1px 0;
            border-style: solid;
            height: $kendo-calendar-navigation-item-height;
            box-sizing: border-box;
            position: absolute;
            inset-block-start: 50%;
            inset-inline-end: 0;
            transform: translateY(-50%);
        }

        // // styles are applied to the k-link element inside
        // .k-selected {
        //     color: inherit;
        //     background: transparent;
        //     border-color: transparent;
        // }
    }

    // Multiview calendar
    .k-calendar-range {
        width: auto;

        .k-calendar-view {
            width: auto;
            white-space: nowrap;

            &::after {
                display: none;
            }

            &:focus {
                outline: 0;
            }
        }
    }

    // Range Selection
    .k-range-start {
        border-radius: 0;
        border-start-start-radius: $kendo-calendar-range-cell-border-radius;
        border-end-start-radius: $kendo-calendar-range-cell-border-radius;

        .k-calendar-cell-inner,
        .k-link {
            border-color: inherit;
            border-radius: inherit;
        }
    }
    .k-range-end {
        border-radius: 0;
        border-start-end-radius: $kendo-calendar-range-cell-border-radius;
        border-end-end-radius: $kendo-calendar-range-cell-border-radius;

        .k-calendar-cell-inner,
        .k-link {
            border-color: inherit;
            border-radius: inherit;
        }
    }
    .k-range-mid {
        border-color: inherit;
        border-radius: 0;
    }
    .k-range-start.k-range-end {
        border-radius: $kendo-calendar-range-cell-border-radius;
    }

}
