"""Недельные агрегаты для воскресного разбора.

Арифметику считает Python, Claude только интерпретирует готовые цифры —
иначе он начинает складывать сам и ошибается.
"""

import argparse
from datetime import date, timedelta

import week


def _avg(values, digits=1):
    clean = [v for v in values if v is not None]
    if not clean:
        return None
    return round(sum(clean) / len(clean), digits)


def _in_range(rows, start, end):
    return [row for day, row in rows.items() if start <= day <= end]


def week_facts(today, days, workouts, food, measurements, stage):
    monday, sunday = week.week_bounds(today)
    prev_monday = monday - timedelta(days=7)
    prev_sunday = monday - timedelta(days=1)

    this_week = _in_range(days, monday, sunday)
    prev_week = _in_range(days, prev_monday, prev_sunday)

    strength = [w for w in workouts if w.is_strength and monday <= w.day <= sunday]
    food_week = _in_range(food, monday, sunday)

    weight_avg = _avg([r.weight for r in this_week])
    weight_avg_prev = _avg([r.weight for r in prev_week])
    delta = (
        round(weight_avg - weight_avg_prev, 1)
        if weight_avg is not None and weight_avg_prev is not None
        else None
    )

    measured = sorted(
        (m for m in measurements.values() if m.fat_pct is not None),
        key=lambda m: m.day,
    )
    in_week = [m for m in measured if monday <= m.day <= sunday]
    before_week = [m for m in measured if m.day < monday]

    return {
        "monday": monday,
        "sunday": sunday,
        "cardio_min": week.cardio_minutes(days, today),
        "cardio_target": stage["cardio_min"],
        "strength_days": len({w.day for w in strength}),
        "strength_target": stage["strength_days"],
        "strength_avg_min": _avg([w.minutes for w in strength], 0) and int(_avg([w.minutes for w in strength], 0)),
        "weight_avg": weight_avg,
        "weight_avg_prev": weight_avg_prev,
        "weight_delta": delta,
        "food_days": len(food_week),
        "kcal_avg": _avg([f.kcal for f in food_week], 0),
        "protein_avg": _avg([f.protein for f in food_week], 0),
        "fat_avg": _avg([f.fat for f in food_week], 0),
        "carbs_avg": _avg([f.carbs for f in food_week], 0),
        "fat_pct": in_week[-1].fat_pct if in_week else None,
        "fat_pct_prev": before_week[-1].fat_pct if before_week else None,
        "sleep_avg": _avg([r.sleep_h for r in this_week]),
        "hrv_avg": _avg([r.hrv for r in this_week]),
        "resting_hr_avg": _avg([r.resting_hr for r in this_week], 0),
    }


def _line(label, value, suffix=""):
    return f"- {label}: {'нет данных' if value is None else f'{value:g}{suffix}'}"


def render_facts(facts):
    """Цифры недели в виде markdown — уходит в промпт Claude как есть."""
    period = f"{facts['monday'].strftime('%d.%m')} – {facts['sunday'].strftime('%d.%m')}"
    return "\n".join([
        f"Период: {period}",
        "",
        "**Активность**",
        _line("Кардио (exercise-минуты Apple)", facts["cardio_min"], f" из {facts['cardio_target']} по ступени"),
        _line("Силовые дни", facts["strength_days"], f" из {facts['strength_target']}"),
        _line("Средняя длительность силовой", facts["strength_avg_min"], " мин"),
        "",
        "**Вес (только средние, отдельные замеры не обсуждаем)**",
        _line("Среднее за неделю", facts["weight_avg"], " кг"),
        _line("Среднее за прошлую неделю", facts["weight_avg_prev"], " кг"),
        _line("Разница", facts["weight_delta"], " кг"),
        _line("% жира, последний замер недели", facts["fat_pct"], "%"),
        _line("% жира, предыдущий замер", facts["fat_pct_prev"], "%"),
        "",
        "**Еда**",
        _line("Дней с записями", facts["food_days"], " из 7"),
        _line("Средние калории", facts["kcal_avg"], " ккал"),
        _line("Средний белок", facts["protein_avg"], " г"),
        _line("Средние жиры", facts["fat_avg"], " г"),
        _line("Средние углеводы", facts["carbs_avg"], " г"),
        "Ориентиры (не цель дня): 1800 ккал, Б 110, Ж 65–70, У 185",
        "",
        "**Восстановление**",
        _line("Сон", facts["sleep_avg"], " ч"),
        _line("HRV", facts["hrv_avg"], " мс"),
        _line("Пульс покоя", facts["resting_hr_avg"], ""),
    ])


def main():
    parser = argparse.ArgumentParser(description="Цифры недели для разбора")
    parser.add_argument("--date", help="дата внутри недели, YYYY-MM-DD")
    args = parser.parse_args()

    import digest  # локальный импорт: weekly.py используется и как библиотека в тестах

    config = digest.load_config()
    today = date.fromisoformat(args.date) if args.date else date.today()
    days, workouts, food, measurements = digest.load_sources(config)

    print(render_facts(week_facts(
        today=today,
        days=days,
        workouts=workouts,
        food=food,
        measurements=measurements,
        stage=week.stage_for(config["stages"], today),
    )))


if __name__ == "__main__":
    main()
