import unittest
from datetime import date

import parsers


DIARY = """# Дневник питания 2026

Нормы: Ккал ~1800, Б 110 г, Ж 65–70 г, У 185 г.

## Апрель 2026

### Сводная таблица

| Дата | Ккал | Б | Ж | У | Заметки |
|------|------|---|---|---|---------|
| 08.04 | ~1891 | ~101 | ~89 | ~174 | болела |

### 8 апреля (болела, день в городе)

| Приём | Ккал | Б | Ж | У |
|-------|------|---|---|---|
| Гранола 53г + йогурт 250г | 511 | 21,9 | 24,5 | 53,4 |
| **Итого** | **~1891** | **~100,8** | **~88,6** | **~173,7** |

### 12 апреля (Пасха)

| Приём | Ккал | Б | Ж | У |
|-------|------|---|---|---|
| Каша 180г | 374 | 16,8 | 13,9 | 45,7 |
| **Итого** | **1814** | **120,2** | **73,4** | **198,2** |

### 13 апреля (в процессе)

Завтрак: панкейки.

## Август 2026

### 1 августа

| Приём | Ккал | Б | Ж | У |
|-------|------|---|---|---|
| Смузи боул | 518 | 24,1 | 19,9 | 59,6 |
| **Итого** | **1874** | **122,2** | **74,2** | **195,2** |
"""


class ParseFoodDiaryTest(unittest.TestCase):
    def test_reads_totals_row(self):
        days = parsers.parse_food_diary(DIARY)

        day = days[date(2026, 4, 12)]
        self.assertEqual(day.kcal, 1814)
        self.assertEqual(day.protein, 120.2)
        self.assertEqual(day.fat, 73.4)
        self.assertEqual(day.carbs, 198.2)

    def test_tilde_marks_estimate_and_is_stripped(self):
        days = parsers.parse_food_diary(DIARY)

        day = days[date(2026, 4, 8)]
        self.assertEqual(day.kcal, 1891)
        self.assertEqual(day.protein, 100.8)
        self.assertTrue(day.estimated)
        self.assertFalse(days[date(2026, 4, 12)].estimated)

    def test_year_comes_from_month_heading(self):
        days = parsers.parse_food_diary(DIARY)

        self.assertIn(date(2026, 8, 1), days)
        self.assertEqual(days[date(2026, 8, 1)].kcal, 1874)

    def test_day_without_totals_is_absent(self):
        days = parsers.parse_food_diary(DIARY)

        self.assertNotIn(date(2026, 4, 13), days)

    def test_summary_table_rows_are_ignored(self):
        days = parsers.parse_food_diary(DIARY)

        self.assertEqual(sorted(days), [date(2026, 4, 8), date(2026, 4, 12), date(2026, 8, 1)])

    def test_empty_text_gives_no_days(self):
        self.assertEqual(parsers.parse_food_diary(""), {})


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