"""Pregnancy tracking API."""
import datetime
from django.utils import timezone
from rest_framework.views import APIView

from core.models import PregnancyTracking, AppUser
from .auth_utils import ok, err
from .permissions import IsAppUser
from .serializers import PregnancySerializer


class PregnancyStartView(APIView):
    permission_classes = [IsAppUser]

    def post(self, request):
        user = request.app_user
        d = request.data
        start = d.get('startDate') or d.get('start_date')
        if not start:
            return err('startDate is required.', 400)

        start_date = (
            datetime.date.fromisoformat(start) if isinstance(start, str) else start
        )
        due_date = start_date + datetime.timedelta(weeks=40)

        weeks_elapsed = (datetime.date.today() - start_date).days // 7
        current_week = max(1, min(weeks_elapsed, 40))

        preg, _ = PregnancyTracking.objects.update_or_create(
            user=user,
            defaults={
                'start_date': start_date,
                'due_date': due_date,
                'current_week': current_week,
                'status': 'active',
                'notes': d.get('notes', ''),
                'created_at': timezone.now(),
                'updated_at': timezone.now(),
            },
        )
        AppUser.objects.filter(id=user.id).update(
            is_pregnant=True, updated_at=timezone.now(),
        )
        return ok(PregnancySerializer(preg).data, 'Pregnancy tracking started.', 201)


class PregnancyDataView(APIView):
    permission_classes = [IsAppUser]

    def get(self, request):
        try:
            preg = PregnancyTracking.objects.get(user=request.app_user, status='active')
        except PregnancyTracking.DoesNotExist:
            return ok(None, 'No active pregnancy found.')

        # Recalculate current week on each fetch
        if preg.start_date:
            start = preg.start_date
            if isinstance(start, str):
                start = datetime.date.fromisoformat(start)
            current_week = max(1, (datetime.date.today() - start).days // 7)
            if current_week != preg.current_week:
                PregnancyTracking.objects.filter(id=preg.id).update(
                    current_week=current_week, updated_at=timezone.now(),
                )
                preg.current_week = current_week

        return ok(PregnancySerializer(preg).data)
