from rest_framework import serializers, viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import (
    Language, FooterMenu, FooterMenuTranslate, SiteSettings, SettingTranslate,
    Faq, FaqTranslate, RequestCallBack, ContactUs, SubscribeNewsletter, ErrorLog
)

# Serializers
class LanguageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Language
        fields = ['id', 'name', 'code']

class FooterMenuSerializer(serializers.ModelSerializer):
    class Meta:
        model = FooterMenu
        fields = ['id', 'name', 'link', 'priority', 'is_active']

class FooterMenuTranslateSerializer(serializers.ModelSerializer):
    footer_menu = FooterMenuSerializer()

    class Meta:
        model = FooterMenuTranslate
        fields = ['id', 'language', 'footer_menu', 'name']

class SiteSettingsSerializer(serializers.ModelSerializer):
    seo_settings = serializers.SerializerMethodField()

    class Meta:
        model = SiteSettings
        fields = ['id', 'site_name', 'site_url', 'files_prefix_url', 'fav_icon', 'main_logo', 'mobile_logo', 'seo_settings']

    def get_seo_settings(self, obj):
        return {
            'site_name': obj.site_name,
            'site_url': obj.site_url,
            'files_prefix_url': obj.files_prefix_url,
        }

class SettingTranslateSerializer(serializers.ModelSerializer):
    site_settings = SiteSettingsSerializer()

    class Meta:
        model = SettingTranslate
        fields = [
            'id', 'site_settings', 'site_name', 'short_description', 'description', 'address', 'phone_number', 'email',
            'rules', 'about_us', 'privacy_policy', 'terms_of_use', 'home_seo_text'
        ]

class FaqTranslateSerializer(serializers.ModelSerializer):
    class Meta:
        model = FaqTranslate
        fields = ['id', 'language', 'question', 'answer']

class FaqSerializer(serializers.ModelSerializer):
    translates = FaqTranslateSerializer(many=True, read_only=True)
    active_status = serializers.SerializerMethodField()

    class Meta:
        model = Faq
        fields = ['id', 'question', 'answer', 'is_active', 'is_translated', 'created_at', 'updated_at', 'translates', 'active_status']

    def get_active_status(self, obj):
        return "Active" if obj.is_active else "Inactive"

class RequestCallBackSerializer(serializers.ModelSerializer):
    class Meta:
        model = RequestCallBack
        fields = ['id', 'first_name', 'last_name', 'phone_number', 'email', 'message', 'page_url', 'created_at']

class ContactUsSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContactUs
        fields = ['id', 'name', 'phone_number', 'email', 'message']

class SubscribeNewsletterSerializer(serializers.ModelSerializer):
    class Meta:
        model = SubscribeNewsletter
        fields = ['id', 'email', 'created_at']

class ErrorLogSerializer(serializers.ModelSerializer):
    recent_errors = serializers.SerializerMethodField()

    class Meta:
        model = ErrorLog
        fields = ['id', 'url', 'location', 'type', 'error', 'created_at', 'recent_errors']

    def get_recent_errors(self, obj):
        return ErrorLog.objects.order_by('-created_at')[:5].values('url', 'type')

# ViewSets
class LanguageViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Language.objects.all()
    serializer_class = LanguageSerializer

class FooterMenuViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = FooterMenu.objects.all()
    serializer_class = FooterMenuSerializer

class SiteSettingsViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = SiteSettings.objects.all()
    serializer_class = SiteSettingsSerializer

class FaqViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Faq.objects.prefetch_related('translates').all()
    serializer_class = FaqSerializer

    @action(detail=False, methods=['get'])
    def by_language(self, request):
        lang = request.query_params.get('language', 'en')
        faqs = self.get_queryset().filter(translates__language__code=lang)
        serializer = self.get_serializer(faqs, many=True)
        return Response(serializer.data)

class RequestCallBackViewSet(viewsets.ModelViewSet):
    queryset = RequestCallBack.objects.all()
    serializer_class = RequestCallBackSerializer

class ContactUsViewSet(viewsets.ModelViewSet):
    queryset = ContactUs.objects.all()
    serializer_class = ContactUsSerializer

class SubscribeNewsletterViewSet(viewsets.ModelViewSet):
    queryset = SubscribeNewsletter.objects.all()
    serializer_class = SubscribeNewsletterSerializer

class ErrorLogViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = ErrorLog.objects.all()
    serializer_class = ErrorLogSerializer
