# quiz/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Country, Category, QuestionAnswer
from .serializers import CountrySerializer, CategorySerializer, QuestionAnswerSerializer
from users.models import CustomUser
import pandas as pd
from django.http import HttpResponse
from io import BytesIO
from datetime import datetime


class CountryCRUDView(APIView):
    def get(self, request):
        countries = Country.objects.all()
        serializer = CountrySerializer(countries, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def post(self, request):
        serializer = CountrySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def put(self, request, country_id):
        try:
            country = Country.objects.get(id=country_id)
            serializer = CountrySerializer(country, data=request.data, partial=True)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        except Country.DoesNotExist:
            return Response({"error": "Country not found"}, status=status.HTTP_404_NOT_FOUND)

    def delete(self, request, country_id):
        try:
            country = Country.objects.get(id=country_id)
            country.delete()
            return Response({"message": "Country deleted"}, status=status.HTTP_200_OK)
        except Country.DoesNotExist:
            return Response({"error": "Country not found"}, status=status.HTTP_404_NOT_FOUND)

class CategoryCRUDView(APIView):
    def get(self, request):
        categories = Category.objects.all()
        serializer = CategorySerializer(categories, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def post(self, request):
        serializer = CategorySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def put(self, request, category_id):
        try:
            category = Category.objects.get(id=category_id)
            serializer = CategorySerializer(category, data=request.data, partial=True)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        except Category.DoesNotExist:
            return Response({"error": "Category not found"}, status=status.HTTP_404_NOT_FOUND)

    def delete(self, request, category_id):
        try:
            category = Category.objects.get(id=category_id)
            category.delete()
            return Response({"message": "Category deleted"}, status=status.HTTP_200_OK)
        except Category.DoesNotExist:
            return Response({"error": "Category not found"}, status=status.HTTP_404_NOT_FOUND)


class ImportQuestionsView(APIView):
    def post(self, request):
        try:
            excel_file = request.FILES.get('file')
            if not excel_file or not excel_file.name.endswith('.xlsx'):
                return Response({"error": "Please upload a valid Excel file"}, status=status.HTTP_400_BAD_REQUEST)

            # Delete all existing questions first
            QuestionAnswer.objects.all().delete()
            print("All existing questions deleted")

            df = pd.read_excel(excel_file)
            print(df)
            
            imported_count = 0
            for index, row in df.iterrows():
                country_name = row.get('country')
                category_name = row.get('category')
                question_text = row.get('question')
                option_a = row.get('option_a')
                option_b = row.get('option_b')
                option_c = row.get('option_c')
                option_d = row.get('option_d')
                correct_option = row.get('correct_option')
                difficulty = row.get('difficulty')
                language = row.get('language')

                if not all([country_name, category_name, question_text, option_a, option_b, option_c, option_d, correct_option , difficulty,language]):
                    continue

                # Check if country and category exist, do not create if not found
                try:
                    country = Country.objects.get(name=country_name)
                except Country.DoesNotExist:
                    return Response({"error": f"Country '{country_name}' not found"}, status=status.HTTP_400_BAD_REQUEST)

                try:
                    category = Category.objects.get(country=country, name=category_name)
                except Category.DoesNotExist:
                    return Response({"error": f"Category '{category_name}' not found for country '{country_name}'"}, status=status.HTTP_400_BAD_REQUEST)

                # Validate correct_option
                if correct_option not in ['A', 'B', 'C', 'D']:
                    return Response({"error": f"Invalid correct_option '{correct_option}' for question at row {index + 2}"}, status=status.HTTP_400_BAD_REQUEST)

                if language not in ['en', 'hi']:
                    return Response({"error": f"Invalid language '{language}' at row {index + 2}. Must be 'en' or 'hi'."}, status=status.HTTP_400_BAD_REQUEST)

                QuestionAnswer.objects.create(
                    country=country,
                    category=category,
                    question_text=question_text,
                    option_a=option_a,
                    option_b=option_b,
                    option_c=option_c,
                    option_d=option_d,
                    correct_option=correct_option,
                    difficulty = difficulty,
                    language=language
                )
                imported_count += 1
            
            return Response({"message": f"Questions imported successfully. {imported_count} questions imported."}, status=status.HTTP_200_OK)
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)

    def put(self, request, question_id):
        try:
            question = QuestionAnswer.objects.get(id=question_id)
        except QuestionAnswer.DoesNotExist:
            return Response({"error": "Question not found"}, status=status.HTTP_404_NOT_FOUND)
        
        serializer = QuestionAnswerSerializer(question, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, question_id):
        try:
            question = QuestionAnswer.objects.get(id=question_id)
            question.delete()
            return Response({"message": "Question deleted successfully"}, status=status.HTTP_200_OK)
        except QuestionAnswer.DoesNotExist:
            return Response({"error": "Question not found"}, status=status.HTTP_404_NOT_FOUND)

    def get(self, request):
        country_name = request.GET.get('country')
        category_name = request.GET.get('category')
        language = request.GET.get('language')
        
        questions = QuestionAnswer.objects.all()
        if country_name:
            questions = questions.filter(country__name=country_name)
        if category_name:
            questions = questions.filter(category__name=category_name)
        if language:
            questions = questions.filter(language=language)
        serializer = QuestionAnswerSerializer(questions, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

            
class ExportQuestionsView(APIView):
    def get(self, request):
        try:
            # Get filter parameters
            country_name = request.GET.get('country')
            category_name = request.GET.get('category')
            
            # Query questions with filters
            questions = QuestionAnswer.objects.select_related('country', 'category').all()
            
            if country_name:
                questions = questions.filter(country__name=country_name)
            if category_name:
                questions = questions.filter(category__name=category_name)
            
            # Prepare data for Excel
            data = []
            for question in questions:
                data.append({
                    'country': question.country.name,
                    'category': question.category.name,
                    'question': question.question_text,
                    'option_a': question.option_a,
                    'option_b': question.option_b,
                    'option_c': question.option_c,
                    'option_d': question.option_d,
                    'correct_option': question.correct_option,
                    'difficulty': question.difficulty,
                    'language': question.language
                })
            
            # If no questions, add two sample rows
            if not data:
                data = [
                    {
                        'country': 'SampleCountry1',
                        'category': 'SampleCategory1',
                        'question': 'What is the capital of SampleCountry1?',
                        'option_a': 'Option A',
                        'option_b': 'Option B',
                        'option_c': 'Option C',
                        'option_d': 'Option D',
                        'correct_option': 'A',
                        'difficulty': 'easy',
                        'language': 'en'
                    },
                    {
                        'country': 'SampleCountry1',
                        'category': 'SampleCategory1',
                        'question': 'नमूदा श्रेणी 2 में सबसे बड़ा ग्रह कौन सा है?',
                        'option_a': 'पृथ्वी',
                        'option_b': 'मंगल',
                        'option_c': 'बृहस्पति',
                        'option_d': 'शुक्र',
                        'correct_option': 'C',
                        'difficulty': 'hard',
                        'language': 'hi'
                    }
                ]
            
            # Create DataFrame
            df = pd.DataFrame(data)
            
            # Ensure columns are in the correct order
            columns = ['country', 'category', 'question', 'option_a', 'option_b', 'option_c', 'option_d', 'correct_option', 'difficulty','language']
            df = df.reindex(columns=columns)
            
            # Create Excel file in memory
            output = BytesIO()
            with pd.ExcelWriter(output, engine='openpyxl') as writer:
                df.to_excel(writer, sheet_name='Questions', index=False)
            
            # Prepare response
            output.seek(0)
            timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
            filename = f'questions_export_{timestamp}.xlsx'
            
            response = HttpResponse(
                output.read(),
                content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
            )
            response['Content-Disposition'] = f'attachment; filename="{filename}"'
            
            return response
            
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)