//------------------------------------------------------------------------------
// Website customizations
//------------------------------------------------------------------------------

// Complete the base website values palette with the first defined font in
// $o-theme-font-configs, this allows themes to just define a list of fonts and
// relying on the fact the first one will be used (but not SYSTEM_FONTS which
// is defined in $o-base-theme-font-configs).
$-first-font-name: nth(map-keys($o-theme-font-configs), 1);
@if map-get($o-base-website-values-palette, 'font') == null {
    $o-base-website-values-palette: map-merge($o-base-website-values-palette, (
        'font': $-first-font-name,
    ));
}

@function o-add-font-config($values) {
    @each $alias, $key in $o-font-aliases-to-keys {
        $font-name: map-get($values, $key);
        $font-config: o-safe-get($o-theme-font-configs, $font-name, ());
        $font-properties: o-safe-get($font-config, 'properties', ());
        $type-font-properties: o-safe-get($font-properties, $alias, ());
        $values: map-merge($values, $type-font-properties);
    }
    @return $values;
}

// Some fonts have been renamed in a stable version, and for retro compatibility
// for users which have a custom user_values.css as attachment with an old font
// already used, we map the old font with the new `similar` font
$o-fonts-similar: (
    'Droid Serif': 'Noto Serif',
    'SinKinSans': 'Spartan',
    'Proxima': 'Montserrat',
    'Comic Sans MS': 'Comic Neue',
    'Fontastique': 'Bubblegum Sans',
    'Luminari': 'Eagle Lake',
    'Fecske': 'Marcellus',
    'Din Alternate': 'Roboto',
    'Muli': 'Mulish',
);

@function o-map-font-aliases($values) {
    $-values: $values;
    @each $key in map-values($o-font-aliases-to-keys) {
        $value: map-get($values, $key);
        @if ($value and map-has-key($o-fonts-similar, $value)) {
            $-values: map-merge($-values, (
                $key: map-get($o-fonts-similar, $value),
            ));
        }
    }
    @return $-values;
};

// By default, most website palette values are null. Each null value is
// automatically replaced with corresponsing values in chosen default values
// palette.
$o-user-website-values: o-map-normalize-website-values($o-user-website-values);
$o-user-website-values: o-map-font-aliases($o-user-website-values);
$-website-values-default: o-safe-nth($o-website-values-palettes, $o-website-values-palette-number, ());
$-website-values-default: map-merge($o-base-website-values-palette, $-website-values-default);
$-actual-user-website-values-palette: map-merge($-website-values-default, $o-user-website-values);
// Default font selection + User font selection have been merged, now need to
// add the right associated font default config
$-actual-user-website-values-palette: o-add-font-config($-actual-user-website-values-palette);
// Reforce the properties which already had a set values in the user map (the
// font properties override the default palette values but not the user ones)
$-actual-user-website-values-palette: map-merge($-actual-user-website-values-palette, $o-user-website-values);
$o-website-values-palettes: append($o-website-values-palettes, $-actual-user-website-values-palette);

// Enable last website values palette, which is now the user customized one
$o-website-values-palette-number: length($o-website-values-palettes);
$o-website-values: $-actual-user-website-values-palette !default;
@function o-website-value($key) {
    @return map-get($o-website-values, $key);
}

$o-theme-navbar-logo-height: o-website-value('logo-height') !default;
$o-theme-navbar-fixed-logo-height: o-website-value('fixed-logo-height') !default;

//------------------------------------------------------------------------------
// Colors
//------------------------------------------------------------------------------

// First change the palette selection to the actual user choice if any, keeping
// compatibility with old numbers too.
$-color-palette-number: o-website-value('color-palettes-number') or if(variable-exists(o-color-palette-number), $o-color-palette-number, null); // Only in old databases
$-color-palette-name: o-website-value('color-palettes-name');
$-gray-color-palette-name: $-color-palette-name;
$-theme-color-palette-name: $-color-palette-name;

// If defined palette number but no *user* defined palette name, this is an
// old database with a old palette selection, we have to find the name from
// the old number
@if ($-color-palette-number and not map-get($o-user-website-values, 'color-palettes-name')) {
    $-compat: $o-color-palettes-compatibility-indexes;
    $-color-palette-name: map-get($-compat, $-color-palette-number) or '';

    $-compat: $o-gray-color-palettes-compatibility-indexes or $o-color-palettes-compatibility-indexes;
    $-gray-color-palette-name: map-get($-compat, $-color-palette-number) or '';

    $-compat: $o-theme-color-palettes-compatibility-indexes or $o-color-palettes-compatibility-indexes;
    $-theme-color-palette-name: map-get($-compat, $-color-palette-number) or '';
}

@if ($-color-palette-name) {
    $o-color-palette-name: $-color-palette-name;
}
@if ($-gray-color-palette-name) {
    $o-gray-color-palette-name: $-gray-color-palette-name;
}
@if ($-theme-color-palette-name) {
    $o-theme-color-palette-name: $-theme-color-palette-name;
}

$o-has-customized-13-0-color-system:
    not not (map-get($o-user-theme-color-palette, 'primary')
    or map-get($o-user-theme-color-palette, 'secondary')
    or map-get($o-user-theme-color-palette, 'alpha')
    or map-get($o-user-theme-color-palette, 'beta')
    or map-get($o-user-theme-color-palette, 'gamma')
    or map-get($o-user-theme-color-palette, 'delta')
    or map-get($o-user-theme-color-palette, 'epsilon'));

$o-has-customized-colors:
    not not (length(map-keys($o-user-color-palette)) > 0
    or map-get($o-user-theme-color-palette, 'success')
    or map-get($o-user-theme-color-palette, 'info')
    or map-get($o-user-theme-color-palette, 'warning')
    or map-get($o-user-theme-color-palette, 'danger'));

// Color palette
// -------------

// By default, most user color palette values are null. Each null value is
// automatically replaced with corresponsing colors in chosen default color
// palette.
$o-user-color-palette: o-map-normalize-website-values($o-user-color-palette);
$-palette-default: map-get($o-color-palettes, $o-color-palette-name) or ();
$-actual-user-color-palette: map-merge($-palette-default, $o-user-color-palette);
// Compatibility with old values in old names
@each $name, $custom-name in (
    // Each of those values were either a number for a color combination, a
    // string for a color name or a color. Now they should only be a number for
    // a color combination and the other value types for the color name/value
    // are handled by another variable.
    'menu': 'menu-custom',
    'header-sales_one': 'header-sales_one-custom',
    'header-sales_two': 'header-sales_two-custom',
    'header-sales_three': 'header-sales_three-custom',
    'header-sales_four': 'header-sales_four-custom',
    'footer': 'footer-custom',
    'copyright': 'copyright-custom'
) {
    $-base-value: map-get($-actual-user-color-palette, $name);
    @if $-base-value and $-base-value != 'NULL' and type-of($-base-value) != 'number' {
        $-base-custom-value: map-get($-actual-user-color-palette, $custom-name);
        $-actual-user-color-palette: map-merge($-actual-user-color-palette, (
            $name: 1,
            $custom-name: $-base-custom-value or $-base-value,
        ));
    }
}
$o-color-palettes: map-merge($o-color-palettes, ('user-palette': $-actual-user-color-palette));

// Gray palette
// ------------

// By default, most user gray palette values are null. Each null value is
// automatically replaced with corresponsing colors in chosen default color
// palette.
$o-user-gray-color-palette: o-map-normalize-website-values($o-user-gray-color-palette);
$-palette-default: map-get($o-gray-color-palettes, $o-gray-color-palette-name) or ();
$-actual-user-gray-color-palette: map-merge($-palette-default, $o-user-gray-color-palette);
$o-gray-color-palettes: map-merge($o-gray-color-palettes, ('user-palette': $-actual-user-gray-color-palette));

// Theme color palette
// -------------------

// alpha -> epsilon colors are from the old color system, this is kept for
// compatibility: Generate default theme color scheme if alpha is set
$-alpha: map-get($o-user-theme-color-palette, 'alpha');
@if ($-alpha) {
    $o-user-theme-color-palette: map-merge((
        beta: lighten(desaturate($-alpha, 60%), 30%),
        gamma: desaturate(adjust-hue($-alpha, -45deg), 10%),
        delta: desaturate(adjust-hue($-alpha, 45deg), 10%),
        epsilon: desaturate(adjust-hue($-alpha, 180deg), 10%),
    ), $o-user-theme-color-palette);
}

// By default, all user theme color palette values are null. Each null value is
// automatically replaced with corresponsing colors in chosen default theme
// color palette.
$o-user-theme-color-palette: o-map-normalize-website-values($o-user-theme-color-palette);
$-palette-default: map-get($o-theme-color-palettes, $o-theme-color-palette-name) or ();
$-actual-user-theme-color-palette: map-merge($-palette-default, $o-user-theme-color-palette);
// Always remove the primary/secondary which were customizable in some theme
// in Odoo <= 13.3. The customer can always rechoose the right color in the
// Odoo color system as the first two ones are mapped to primary/secondary.
$-actual-user-theme-color-palette: map-remove($-actual-user-theme-color-palette,
    'primary',
    'secondary'
);
$o-theme-color-palettes: map-merge($o-theme-color-palettes, ('user-palette': $-actual-user-theme-color-palette));

// ---

// Enable last color and theme color palettes, which are now the user customized
// color palettes.
$o-original-color-palette-name: $o-color-palette-name;
$o-color-palette-name: 'user-palette';
$o-gray-color-palette-name: 'user-palette';
$o-theme-color-palette-name: 'user-palette';

$o-we-auto-contrast-exclusions: () !default;
$o-we-auto-contrast-exclusions: join($o-we-auto-contrast-exclusions, map-keys($o-user-color-palette));

//------------------------------------------------------------------------------
// Fonts
//------------------------------------------------------------------------------

// Use $o-base-theme-font-configs to extend $o-theme-font-configs whatever
// themes added inside.
$o-theme-font-configs: map-merge($o-base-theme-font-configs, $o-theme-font-configs);

// Merge base fonts with user-added google fonts
@each $font-name in (o-website-value('google-fonts') or ()) {
    $o-theme-font-configs: map-merge($o-theme-font-configs, (
        $font-name: (
            'family': (quote($font-name), sans-serif),
            'url': quote($font-name) + ':300,300i,400,400i,700,700i',
        ),
    ));
}

// Add locally hosted google fonts
@each $font-name, $font-attach-id in (o-website-value('google-local-fonts') or ()) {
    // If a font exists both remotely and locally, we remove the remote font to
    // prioritize the local font.
    $o-theme-font-configs: map-remove($o-theme-font-configs, $font-name);
    $o-theme-font-configs: map-merge($o-theme-font-configs, (
        $font-name: (
            'family': (quote($font-name), sans-serif),
            'attachment': $font-attach-id,
            'name': quote($font-name),
        ),
    ));
}

// Add locally hosted uploaded fonts
@each $font-name, $font-attach-id in (o-website-value('uploaded-local-fonts') or ()) {
    // If a font exists both remotely and locally, we remove the remote font to
    // prioritize the local font.
    $o-theme-font-configs: map-remove($o-theme-font-configs, $font-name);
    $o-theme-font-configs: map-merge($o-theme-font-configs, (
        $font-name: (
            'family': (quote($font-name), sans-serif),
            'attachment': $font-attach-id,
            'name': quote($font-name),
        ),
    ));
}

// Add odoo unicode support for all fonts
@each $font-name, $font-config in $o-theme-font-configs {
    $o-theme-font-configs: map-merge($o-theme-font-configs, (
        $font-name: map-merge($font-config, (
            'family': o-add-unicode-support-font(map-get($font-config, 'family')),
        )),
    ));
}

// Function which allows to retrieve a base info (family, url, properties) about
// a component (base, navbar, ...)'s font. The font name is retrievable via a
// simple o-website-value call.
@function o-get-font-info($alias: 'base', $config-key: 'family') {
    $key: map-get($o-font-aliases-to-keys, $alias);
    $font-name: o-website-value($key);
    $-font-config: o-safe-get($o-theme-font-configs, $font-name, ());
    @return map-get($-font-config, $config-key);
}

$o-theme-font: o-get-font-info('base') !default;
// A theme which defines no default font normally automatically uses the first
// one in $o-base-theme-font-configs. This ensures a misconfiguration also does.
$o-theme-font: $o-theme-font or o-add-unicode-support-font($o-system-fonts);
$o-theme-headings-font: o-get-font-info('headings') or $o-theme-font !default;
$o-theme-h2-font: o-get-font-info('h2') or $o-theme-headings-font !default;
$o-theme-h3-font: o-get-font-info('h3') or $o-theme-headings-font !default;
$o-theme-h4-font: o-get-font-info('h4') or $o-theme-headings-font !default;
$o-theme-h5-font: o-get-font-info('h5') or $o-theme-headings-font !default;
$o-theme-h6-font: o-get-font-info('h6') or $o-theme-headings-font !default;
$o-theme-display-1-font: o-get-font-info('display-1') or $o-theme-headings-font !default;
$o-theme-display-2-font: o-get-font-info('display-2') or $o-theme-headings-font !default;
$o-theme-display-3-font: o-get-font-info('display-3') or $o-theme-headings-font !default;
$o-theme-display-4-font: o-get-font-info('display-4') or $o-theme-headings-font !default;
$o-theme-navbar-font: o-get-font-info('navbar') or $o-theme-font !default;
$o-theme-buttons-font: o-get-font-info('buttons') or $o-theme-font !default;

$o-small-font-size: o-website-value('small-font-size') !default;
