@use 'sass:list';
@use 'sass:map';
@use 'vars' as *;

// Контракт подложки ("островка"): блок объявляет цвета для того, что лежит
// внутри, и всё подхватывает это каскадом.
//
//   // в компоненте
//   .ui-popup { @include surface(overlay); }
//
//   // в теме — только отличия
//   $surfaces: (overlay: (control-bg: $color-slate-750, text: $color-white));
//
// Подложки нет в карте темы — не печатается ничего, компоненты остаются на
// своих базовых токенах. Так тема, которой тут нечего менять, не пишет ни строки.
//
// Каждый цвет компонента читается своей переменной — var(--input-bg, <токен темы>).
// Один уровень, никакой вложенности. Значит любой цвет можно переопределить
// поштучно, минуя роли:
//
//   .promo-card {
//     --input-s-border: transparent;
//   }
//
// Роли — сокращение для частого случая: одна роль расписывается сразу на все
// переменные, которые ей соответствуют.
//
// Новый компонент не добавляет ролей — дописывает свои переменные в готовые.
// Новая роль нужна только когда тема должна развести то, что сейчас склеено.

// Тема вправе не описывать подложку, поэтому её отсутствие в карте — не ошибка.
// А вот опечатка в @include surface(...) иначе прошла бы молча, отсюда список.
$surface-names: (overlay,);
$surface-roles: (
  text: (--video-mini-card-title, --radio-text, --checkbox-text, --page-history-confirm-text),
  text-muted: (--video-mini-card-channel, --video-mini-card-duration, --page-history-confirm-muted),
  control-bg: (--input-bg, --select-bg),
  control-compact-bg: (--input-s-bg,),
  control-bg--disabled: (--input-bg--disabled,),
  control-text: (--input-text, --input-autofill-text, --select-text),
  control-compact-text: (--input-s-text,),
  control-text--disabled: (--input-text--disabled,),
  control-placeholder: (--input-placeholder, --select-placeholder),
  control-label: (--input-label, --select-label),
  control-compact-label: (--select-label-secondary,),
  control-border: (--input-border, --select-border),
  control-compact-border: (--input-s-border, --select-border-secondary),
  control-border--focus: (--input-border--focus,),
  control-compact-border--focus: (--input-s-border--focus,),
  control-border--error: (--input-border--error,),
  control-icon: (--input-icon, --input-pre-icon, --input-button-text, --select-icon),
  control-icon--hover: (--input-button-text--hover,),
  option-bg: (--select-option-bg,),
  option-text: (--select-option-text,),
  accent: (--select-count-bg--active,),
  accent-text: (--select-count-text--active,),
  accent-bg-subtle: (--select-bg--active,),
  accent-border: (--select-border--active,)
);

@mixin surface($name) {
  @if not list.index($surface-names, $name) {
    @error 'surface(): неизвестная подложка `#{$name}`. Допустимые: #{$surface-names}';
  }

  $overrides: map.get($surfaces, $name);

  @if $overrides {
    @each $role, $value in $overrides {
      $props: map.get($surface-roles, $role);

      @if not $props {
        @error 'surface(#{$name}): неизвестная роль `#{$role}`. Допустимые: #{map.keys($surface-roles)}';
      }

      @if $value {
        @each $prop in $props {
          #{$prop}: #{$value};
        }
      }
    }
  }
}
