#ifndef RELAY_LOGIC_H
#define RELAY_LOGIC_H

#include <Arduino.h>

// Массив пинов — определяем в .ino, а здесь только объявляем
extern const uint8_t RELAY_PINS[CHANNEL_NUM];

// Состояния каналов — тоже логика реле, а не ядра
extern bool channelState[CHANNEL_NUM];

extern const bool RELAY_INVERT[CHANNEL_NUM];

inline void applyChannelState(uint8_t ch, bool on) {
  if (ch >= CHANNEL_NUM) return;

  uint8_t pin = sh_channel_pin(ch);
  if (pin == SH_PIN_UNUSED) return;

  bool physicalOn = on ^ sh_channel_is_inverted(ch);
  Serial.println(physicalOn ? HIGH : LOW);
  digitalWrite(pin, physicalOn ? HIGH : LOW);
}

inline bool getChannelState(uint8_t ch) {
  if (ch >= CHANNEL_NUM) return false;
  return channelState[ch];
}

// Установить состояние канала + callback + сохранение
void setChannelState(uint8_t ch, bool on) {
  if (ch >= CHANNEL_NUM) return;
  channelState[ch] = on;
  applyChannelState(ch, on);
}

// Для старой совместимости
bool getPrimaryState() {
  return getChannelState(0);
}

inline void setOn(bool on) {
  setChannelState(0, on);
}

#endif
