"""User profile & onboarding API."""
from django.utils import timezone
from rest_framework.views import APIView

from core.models import AppUser, UserOnboarding
from .auth_utils import ok, err
from .permissions import IsAppUser
from .serializers import UserProfileSerializer, UserOnboardingSerializer


class UserProfileView(APIView):
    permission_classes = [IsAppUser]

    def get(self, request):
        s = UserProfileSerializer(request.app_user)
        return ok(s.data)

    def put(self, request):
        s = UserProfileSerializer(
            request.app_user, data=request.data, partial=True,
        )
        if not s.is_valid():
            return err(str(s.errors), 400)
        s.save(updated_at=timezone.now())
        return ok(s.data, 'Profile updated.')


class OnboardingView(APIView):
    permission_classes = [IsAppUser]

    def post(self, request):
        user = request.app_user
        d = request.data

        # Also update cycle-length on the user record
        cycle = d.get('cycleLengthDays') or d.get('cycle_length_days')
        if cycle:
            AppUser.objects.filter(id=user.id).update(
                cycle_length_days=int(cycle), updated_at=timezone.now(),
            )

        obj, _ = UserOnboarding.objects.update_or_create(
            user=user,
            defaults={
                'is_married': d.get('isMarried', False),
                'first_period_age': d.get('firstPeriodAge', 12),
                'last_period_first_day': (
                    d.get('lastPeriodFirstDay') or d.get('last_period_first_day')
                ),
                'is_planning_baby': d.get('isPlanningBaby'),
                'updated_at': timezone.now(),
            },
        )
        s = UserOnboardingSerializer(obj)
        return ok(s.data, 'Onboarding saved.')
