import unittest

from sohstationviewer.model.reftek.reftek_data.header import (
    parse_rt130_time,
    get_rt130_packet_header, NotRT130FileError,
)


class TestParseRT130Time(unittest.TestCase):
    def test_time_bytes_parsed_correctly(self):
        time_bytes = b'\x36\x01\x15\x13\x51\x35'
        year = 15
        result = parse_rt130_time(year, time_bytes)
        self.assertEqual(result.julday, 360)
        self.assertEqual(result.day, 26)
        self.assertEqual(result.month, 12)
        self.assertEqual(result.hour, 11)
        self.assertEqual(result.minute, 51)
        self.assertEqual(result.second, 35)
        self.assertEqual(result.microsecond, 135000)
        self.assertEqual(result.ns, 1451130695135000000)

    def test_year_1900s(self):
        time_bytes = b'\x36\x01\x15\x13\x51\x35'
        year = 71
        result = parse_rt130_time(year, time_bytes)
        self.assertEqual(result.year, 1971)

    def test_year_2000s(self):
        time_bytes = b'\x36\x01\x15\x13\x51\x35'
        year = 12
        result = parse_rt130_time(year, time_bytes)
        self.assertEqual(result.year, 2012)

    def test_year_threshold(self):
        with self.subTest('test_year_is_49'):
            time_bytes = b'\x36\x01\x15\x13\x51\x35'
            year = 49
            result = parse_rt130_time(year, time_bytes)
            self.assertEqual(result.year, 2049)
        with self.subTest('test_year_is_50'):
            time_bytes = b'\x36\x01\x15\x13\x51\x35'
            year = 50
            result = parse_rt130_time(year, time_bytes)
            self.assertEqual(result.year, 1950)


class TestGetRT130PacketHeader(unittest.TestCase):
    def test_header_extracted_correctly(self):
        header = b'DT\x12\x15\x98\xe1\x36\x01\x15\x13\x51\x35\x05\x12\x01\x11'
        packet = header + b' ' * 1008
        result = get_rt130_packet_header(packet)
        self.assertEqual(result.packet_type, 'DT')
        self.assertEqual(result.experiment_number, 12)
        self.assertEqual(result.unit_id, '98E1')
        self.assertEqual(result.time.ns, 1451130695135000000)
        self.assertEqual(result.byte_count, 512)
        self.assertEqual(result.packet_sequence, 111)

    def test_packet_type_cannot_be_parsed(self):
        packet_type = b'\x01\x02'
        header = packet_type + b'\x11' * 14
        packet = header + b' ' * 1008
        with self.assertRaises(NotRT130FileError):
            get_rt130_packet_header(packet)

    def test_packet_type_is_not_valid(self):
        packet_type = b'AB'
        header = packet_type + b'\x11' * 14
        packet = header + b' ' * 1008
        with self.assertRaises(NotRT130FileError):
            get_rt130_packet_header(packet)