from rest_framework import generics, status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
from django.shortcuts import get_object_or_404
from .models import DesignSettings
from .serializers import DesignSettingsSerializer, PublicDesignSettingsSerializer


class DesignSettingsView(generics.RetrieveUpdateAPIView):
    """
    API для получения и обновления настроек дизайна пользователя
    """
    serializer_class = DesignSettingsSerializer
    permission_classes = [IsAuthenticated]
    parser_classes = [MultiPartParser, FormParser, JSONParser]  # Поддержка файлов и JSON

    def get_object(self):
        # Получаем или создаем настройки для текущего пользователя
        settings, created = DesignSettings.objects.get_or_create(
            user=self.request.user
        )
        return settings

    def perform_update(self, serializer):
        serializer.save(user=self.request.user)


@api_view(['GET'])
def get_user_design_settings(request, username=None):
    """
    Получение публичных настроек дизайна пользователя для отображения его страницы
    """
    if username:
        from django.contrib.auth import get_user_model
        User = get_user_model()
        try:
            user = User.objects.get(username=username)
            try:
                settings = DesignSettings.objects.get(user=user)
                # Возвращаем только публичные настройки
                serializer = PublicDesignSettingsSerializer(settings, context={'request': request})
                return Response(serializer.data)
            except DesignSettings.DoesNotExist:
                # Возвращаем настройки по умолчанию, если пользователь еще не настроил дизайн
                default_settings = {
                    'theme_color': '#ffffff',
                    'dashboard_layout': 'list',
                    'groups_default_expanded': True,
                    'show_group_icons': True,
                    'show_link_icons': True,
                    'dashboard_background_color': '#f8f9fa',
                    'font_family': 'sans-serif'
                }
                return Response(default_settings)
        except User.DoesNotExist:
            return Response({'error': 'Пользователь не найден'}, status=404)
    else:
        # Для получения настроек текущего пользователя требуется авторизация
        if not request.user.is_authenticated:
            return Response({'error': 'Требуется авторизация'}, status=401)
        # Возвращаем настройки текущего пользователя
        settings, created = DesignSettings.objects.get_or_create(user=request.user)
        serializer = DesignSettingsSerializer(settings, context={'request': request})
        return Response(serializer.data)
