import unittest
from datetime import date

import parsers
from parsers import DayRow

TABLE = """# Замеры веса и состава тела

| Дата | Вес | % жира | Мышцы% | Вода% | Метаб.возраст | Висцер.жир | СООВ |
|------|-----|--------|--------|-------|---------------|------------|------|
| 2026-07-26 | 63.2 | 34.7% | 61.8% | 46.8% | 38 | 8 | 1337 |
| 2026-07-27 | 63.6 | 34.4% | — | — | — | — | — |
| 2026-08-01 | **64.1** | **35.1%** | 61.3% | 46.4% | 39 | 8 | 1345 |
"""


class ParseBodyCompositionTest(unittest.TestCase):
    def test_reads_weight_and_fat(self):
        rows = parsers.parse_body_composition(TABLE)

        self.assertEqual(rows[date(2026, 7, 26)].weight, 63.2)
        self.assertEqual(rows[date(2026, 7, 26)].fat_pct, 34.7)

    def test_strips_bold_and_percent(self):
        rows = parsers.parse_body_composition(TABLE)

        self.assertEqual(rows[date(2026, 8, 1)].weight, 64.1)
        self.assertEqual(rows[date(2026, 8, 1)].fat_pct, 35.1)


class MergeWeightsTest(unittest.TestCase):
    def test_measurement_fills_gap_in_daily_series(self):
        days = {date(2026, 8, 1): DayRow(day=date(2026, 8, 1), steps=500, weight=None)}
        measured = parsers.parse_body_composition(TABLE)

        merged = parsers.merge_weights(days, measured)

        self.assertEqual(merged[date(2026, 8, 1)].weight, 64.1)
        self.assertEqual(merged[date(2026, 8, 1)].steps, 500)

    def test_daily_series_value_wins_when_present(self):
        days = {date(2026, 8, 1): DayRow(day=date(2026, 8, 1), weight=99.9)}

        merged = parsers.merge_weights(days, parsers.parse_body_composition(TABLE))

        self.assertEqual(merged[date(2026, 8, 1)].weight, 99.9)

    def test_measurement_day_missing_from_series_is_added(self):
        merged = parsers.merge_weights({}, parsers.parse_body_composition(TABLE))

        self.assertEqual(merged[date(2026, 7, 27)].weight, 63.6)

    def test_fat_percent_is_not_copied_into_daily_rows(self):
        # состав тела в ежедневный не попадает — только вес
        merged = parsers.merge_weights({}, parsers.parse_body_composition(TABLE))

        self.assertIsNone(merged[date(2026, 8, 1)].fat_pct)


if __name__ == "__main__":
    unittest.main()
