"""Tests for helper functions."""

import pytest

from switchbot.helpers import parse_power_data


def test_parse_power_data_basic():
    """Test basic power data parsing."""
    # Test data: bytes with value 0x1234 (4660 decimal) at offset 0
    data = b"\x12\x34\x56\x78"

    # Test without scale (should return raw value)
    assert parse_power_data(data, 0) == 4660

    # Test with scale of 10
    assert parse_power_data(data, 0, 10.0) == 466.0

    # Test with scale of 100
    assert parse_power_data(data, 0, 100.0) == 46.6


def test_parse_power_data_with_offset():
    """Test power data parsing with different offsets."""
    data = b"\x00\x00\x12\x34\x56\x78"

    # Value at offset 2 should be 0x1234
    assert parse_power_data(data, 2, 10.0) == 466.0

    # Value at offset 4 should be 0x5678
    assert parse_power_data(data, 4, 10.0) == 2213.6


def test_parse_power_data_with_mask():
    """Test power data parsing with bitmask."""
    # Test data: 0xFFFF
    data = b"\xff\xff"

    # Without mask
    assert parse_power_data(data, 0, 10.0) == 6553.5

    # With mask 0x7FFF (clear highest bit)
    assert parse_power_data(data, 0, 10.0, 0x7FFF) == 3276.7


def test_parse_power_data_insufficient_data():
    """Test error handling for insufficient data."""
    data = b"\x12"  # Only 1 byte

    # Should raise ValueError when trying to read 2 bytes
    with pytest.raises(ValueError, match="Insufficient data"):
        parse_power_data(data, 0)

    # Should also fail at offset 1 with 2-byte data
    data = b"\x12\x34"
    with pytest.raises(ValueError, match="Insufficient data"):
        parse_power_data(data, 1)  # Would need to read bytes 1-2


def test_parse_power_data_real_world_examples():
    """Test with real-world examples from relay switch."""
    # Simulate relay switch data structure
    raw_data = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x00\x0f\x00\xe8"

    # Voltage at offset 9-10: 0x00DC = 220 / 10.0 = 22.0V
    assert parse_power_data(raw_data, 9, 10.0) == 22.0

    # Current at offset 11-12: 0x000F = 15 / 1000.0 = 0.015A
    assert parse_power_data(raw_data, 11, 1000.0) == 0.015

    # Power at offset 13-14: 0x00E8 = 232 / 10.0 = 23.2W
    assert parse_power_data(raw_data, 13, 10.0) == 23.2