@use 'sass:map';
@use '../config' as *;

$themes: (
    dark: (
        scheme: dark,
        primary: hsl(0,0%,97%),
        primary-10: hsl(0,0%,82%),
        primary-20: hsl(0,0%,69%),
        primary-30: hsl(0,0%,48%),
        primary-40: hsl(0,0%,28%),
        primary-50: hsl(0,0%,18%),
        primary-60: hsl(0,0%,8%),
        primary-70: hsl(0,0%,4%),
        info: hsl(192,80%,50%),
        info-accent: hsl(192,100%,60%),
        info-fg: hsl(0,0%,0%),
        success: hsl(162,60%,42%),
        success-accent: hsl(162,62%,48%),
        success-fg: hsl(0,0%,0%),
        warning: hsl(30,100%,63%),
        warning-accent: hsl(32,100%,68%),
        warning-fg: hsl(0,0%,0%),
        alert: hsl(0,68%,52%),
        alert-accent: hsl(0,80%,62%),
        alert-fg: hsl(0,0%,100%),
        overlay: hsla(0,0%,0%,0.62)
    ),
    light: (
        scheme: light,
        primary: hsl(0,0%,5%),
        primary-10: hsl(0,0%,12%),
        primary-20: hsl(0,0%,25%),
        primary-30: hsl(0,0%,44%),
        primary-40: hsl(0,0%,68%),
        primary-50: hsl(0,0%,80%),
        primary-60: hsl(0,0%,92%),
        primary-70: hsl(0,0%,97%),
        info: hsl(200,100%,34%),
        info-accent: hsl(200,100%,42%),
        info-fg: hsl(0,0%,100%),
        success: hsl(155,80%,26%),
        success-accent: hsl(155,72%,36%),
        success-fg: hsl(0,0%,100%),
        warning: hsl(32,100%,35%),
        warning-accent: hsl(32,100%,50%),
        warning-fg: hsl(0,0%,100%),
        alert: hsl(0,76%,36%),
        alert-accent: hsl(0,72%,46%),
        alert-fg: hsl(0,0%,100%),
        overlay: hsla(0,0%,0%,0.62)
    ),
    midnight: (
        scheme: dark,
        primary: hsl(213,60%,95%),
        primary-10: hsl(213,40%,82%),
        primary-20: hsl(213,30%,68%),
        primary-30: hsl(213,25%,50%),
        primary-40: hsl(213,35%,28%),
        primary-50: hsl(213,42%,22%),
        primary-60: hsl(213,55%,10%),
        primary-70: hsl(213,68%,5%),
        info: hsl(214,100%,67%),
        info-accent: hsl(214,100%,78%),
        info-fg: hsl(0,0%,0%),
        success: hsl(171,83%,38%),
        success-accent: hsl(162,62%,48%),
        success-fg: hsl(0,0%,0%),
        warning: hsl(31,100%,55%),
        warning-accent: hsl(31,100%,65%),
        warning-fg: hsl(0,0%,0%),
        alert: hsl(0,77%,50%),
        alert-accent: hsl(0,90%,68%),
        alert-fg: hsl(0,0%,100%),
        overlay: hsla(213,100%,7%,0.62)
    ),
    amber: (
        scheme: dark,
        primary: hsl(40,20%,95%),
        primary-10: hsl(40,15%,82%),
        primary-20: hsl(40,20%,70%),
        primary-30: hsl(40,10%,48%),
        primary-40: hsl(40,10%,22%),
        primary-50: hsl(40,8%,17%),
        primary-60: hsl(40,5%,10%),
        primary-70: hsl(40,5%,5%),
        info: hsl(180,58%,52%),
        info-accent: hsl(192,95%,58%),
        info-fg: hsl(0,0%,0%),
        success: hsl(88,62%,52%),
        success-accent: hsl(88,72%,62%),
        success-fg: hsl(0,0%,0%),
        warning: hsl(42,98%,52%),
        warning-accent: hsl(38,98%,64%),
        warning-fg: hsl(0,0%,0%),
        alert: hsl(340,100%,69%),
        alert-accent: hsl(340,90%,72%),
        alert-fg: hsl(0,0%,0%),
        overlay: hsla(0,0%,0%,0.62)
    ),
    nordic: (
        scheme: light,
        primary: hsl(200,25%,7%),
        primary-10: hsl(200,22%,15%),
        primary-20: hsl(200,18%,27%),
        primary-30: hsl(200,14%,43%),
        primary-40: hsl(200,16%,68%),
        primary-50: hsl(200,18%,82%),
        primary-60: hsl(200,22%,92%),
        primary-70: hsl(200,28%,97%),
        info: hsl(205,82%,32%),
        info-accent: hsl(205,88%,42%),
        info-fg: hsl(0,0%,100%),
        success: hsl(162,65%,26%),
        success-accent: hsl(162,68%,36%),
        success-fg: hsl(0,0%,100%),
        warning: hsl(36,95%,34%),
        warning-accent: hsl(36,95%,46%),
        warning-fg: hsl(0,0%,100%),
        alert: hsl(356,68%,38%),
        alert-accent: hsl(356,72%,50%),
        alert-fg: hsl(0,0%,100%),
        overlay: hsla(200,30%,8%,0.58)
    ),
    vintage: (
        scheme: light,
        primary: hsl(25,55%,8%),
        primary-10: hsl(25,45%,16%),
        primary-20: hsl(25,38%,30%),
        primary-30: hsl(25,28%,42%),
        primary-40: hsl(25,30%,66%),
        primary-50: hsl(25,32%,78%),
        primary-60: hsl(25,38%,89%),
        primary-70: hsl(25,62%,95%),
        info: hsl(211,62%,45%),
        info-accent: hsl(211,62%,55%),
        info-fg: hsl(0,0%,100%),
        success: hsl(166,52%,30%),
        success-accent: hsl(166,52%,42%),
        success-fg: hsl(0,0%,100%),
        warning: hsl(28,80%,52%),
        warning-accent: hsl(28,80%,60%),
        warning-fg: hsl(0,0%,0%),
        alert: hsl(350,52%,38%),
        alert-accent: hsl(350,60%,50%),
        alert-fg: hsl(0,0%,100%),
        overlay: hsla(25,30%,16%,0.62)
    ),
    synthwave: (
        scheme: dark,
        primary: hsl(242,20%,96%),
        primary-10: hsl(242,20%,88%),
        primary-20: hsl(286,62%,84%),
        primary-30: hsl(286,55%,60%),
        primary-40: hsl(272,68%,38%),
        primary-50: hsl(265,68%,30%),
        primary-60: hsl(228,62%,12%),
        primary-70: hsl(228,72%,6%),
        info: hsl(205,100%,56%),
        info-accent: hsl(192,100%,70%),
        info-fg: hsl(0,0%,0%),
        success: hsl(86,100%,43%),
        success-accent: hsl(90,100%,62%),
        success-fg: hsl(0,0%,0%),
        warning: hsl(28,100%,58%),
        warning-accent: hsl(28,100%,68%),
        warning-fg: hsl(0,0%,0%),
        alert: hsl(0,80%,50%),
        alert-accent: hsl(0,80%,66%),
        alert-fg: hsl(0,0%,100%),
        overlay: hsla(258,80%,8%,0.76)
    ),
    forest: (
        scheme: dark,
        primary: hsl(150,18%,95%),
        primary-10: hsl(150,14%,82%),
        primary-20: hsl(150,12%,68%),
        primary-30: hsl(150,10%,48%),
        primary-40: hsl(150,18%,28%),
        primary-50: hsl(150,22%,18%),
        primary-60: hsl(150,30%,10%),
        primary-70: hsl(150,38%,4%),
        info: hsl(178,55%,38%),
        info-accent: hsl(178,62%,50%),
        info-fg: hsl(0,0%,0%),
        success: hsl(122,45%,42%),
        success-accent: hsl(122,50%,55%),
        success-fg: hsl(0,0%,0%),
        warning: hsl(38,95%,52%),
        warning-accent: hsl(38,100%,62%),
        warning-fg: hsl(0,0%,0%),
        alert: hsl(4,72%,50%),
        alert-accent: hsl(4,80%,62%),
        alert-fg: hsl(0,0%,100%),
        overlay: hsla(150,40%,3%,0.68)
    )
);

@mixin theme($theme: 'dark', $selector: ':root', $level: AA, $customThemes: ()) {
    $allThemes: map.merge($themes, $customThemes);
    $selectedTheme: map.get($allThemes, $theme);

    @include validate-theme($allThemes, $theme, $level);

    @if ($selectedTheme == null) {
        @warn "Unknown theme `#{$theme}`. Defaulting to `dark`. Available themes: #{map.keys($allThemes)}.";

        $selectedTheme: map.get($allThemes, 'dark');
    }

    #{$selector} {
        @each $token, $value in $selectedTheme {
            --w-color-#{$token}: #{$value};
        }
    }
}
