import { describe, expect, it } from 'vitest';
import {
  computeChannelRuntimeStatus,
  pickChannelRuntimeStatus,
} from '@/lib/channel-status';

describe('channel runtime status helpers', () => {
  it('treats healthy running channels as connected', () => {
    expect(
      computeChannelRuntimeStatus({
        running: true,
        connected: false,
        linked: false,
      }),
    ).toBe('connected');
  });

  it('treats successful probes as connected for forward compatibility', () => {
    expect(
      computeChannelRuntimeStatus({
        probe: { ok: true },
        running: false,
      }),
    ).toBe('connected');
  });

  it('returns error when runtime reports a lastError', () => {
    expect(
      computeChannelRuntimeStatus({
        running: true,
        lastError: 'bot token invalid',
      }),
    ).toBe('error');
  });

  it('returns disconnected for empty runtime state', () => {
    expect(computeChannelRuntimeStatus({})).toBe('disconnected');
  });

  it('keeps connected status when another account has an error', () => {
    expect(
      pickChannelRuntimeStatus([
        { connected: true },
        { lastError: 'boom' },
      ]),
    ).toBe('connected');
  });

  it('treats multi-account healthy running channels as connected', () => {
    expect(
      pickChannelRuntimeStatus([
        { running: true, connected: false },
        { running: true, connected: false },
      ]),
    ).toBe('connected');
  });

  it('uses summary-level errors when no account is connected', () => {
    expect(
      pickChannelRuntimeStatus(
        [{ accountId: 'default', connected: false, running: false }],
        { error: 'channel bootstrap failed' },
      ),
    ).toBe('error');
  });

  it('returns degraded when gateway health is degraded', () => {
    expect(
      computeChannelRuntimeStatus(
        { running: true, connected: false, linked: false },
        { gatewayHealthState: 'degraded' },
      ),
    ).toBe('degraded');
  });

  it('keeps runtime error higher priority than degraded overlay', () => {
    expect(
      computeChannelRuntimeStatus(
        { running: true, lastError: 'bot token invalid' },
        { gatewayHealthState: 'degraded' },
      ),
    ).toBe('error');
  });

  it('degrades channel summary when gateway health is degraded', () => {
    expect(
      pickChannelRuntimeStatus(
        [{ connected: false, running: false }],
        undefined,
        { gatewayHealthState: 'degraded' },
      ),
    ).toBe('degraded');
  });

  it('keeps summary error higher priority than degraded gateway health', () => {
    expect(
      pickChannelRuntimeStatus(
        [{ connected: false, running: false }],
        { error: 'channel bootstrap failed' },
        { gatewayHealthState: 'degraded' },
      ),
    ).toBe('error');
  });
});