from __future__ import annotations

import os
import uuid

from django.contrib.auth.models import User
from django.db import models
from django.urls import reverse

from MNF import settings
from centralisedFileSystem.filetypes import ALLOWED_FILETYPES


class ScreenPlay(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="screenplays", editable=False)
    author = models.CharField(max_length=100)
    name = models.CharField(max_length=200, blank=False, null=False)
    created_on = models.DateTimeField(auto_now_add=True)
    version_count = models.IntegerField(default=0, editable=False)

    class Meta:
        unique_together = ("user", "name")
        get_latest_by = "created_on"

    def __str__(self) -> str:
        return str(self.name)

    def get_absolute_url(self) -> str:
        return reverse("screenplay_detail", kwargs={"pk": self.pk})

    def next_version(self) -> int:
        self.version_count = self.version_count + 1
        self.save()
        return self.version_count


class Script(models.Model):

    LANGUAGES = tuple((k, v) for k, v in settings.languages.items())

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    screenplay = models.ForeignKey(ScreenPlay, on_delete=models.CASCADE, related_name="scripts")
    created_on = models.DateTimeField(auto_now_add=True)
    modified_on = models.DateTimeField(auto_now=True)
    version = models.IntegerField(editable=False, null=True)
    language = models.CharField(max_length=100, default="", choices=LANGUAGES)
    # user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="screenplays", editable=False)
    
    class Meta:
        get_latest_by = "created_on"

    def __str__(self) -> str:
        return f"{self.screenplay.name} -V{self.version}"

    def get_absolute_url(self) -> str:
        return reverse("script_detail", kwargs={"pk": self.pk})


def generate_upload_folder(instance : File, filename : str) -> str:
    script_folder = os.path.join(settings.MEDIA_ROOT,"scripts_folder", str(instance.script.id))
    os.makedirs(script_folder, exist_ok=True)

    filename = f"{instance.id}.{filename.rsplit('.', 1)[1]}"

    return os.path.join(script_folder, filename)


class File(models.Model):

    FILE_CHOICES = tuple(((k, k) for k in ALLOWED_FILETYPES))

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    script = models.ForeignKey(Script, on_delete=models.CASCADE, related_name="scripts_files")
    content_type = models.CharField(max_length=200, editable=False)
    file = models.FileField(upload_to=generate_upload_folder, blank=True)
    type = models.CharField(max_length=50, choices=FILE_CHOICES)
    created_on = models.DateTimeField(auto_now_add=True)
    modified_on = models.DateTimeField(auto_now=True)
    modification_id = models.IntegerField(default=0, editable=False)
    skip_post_save = models.BooleanField(default = False,null=True,blank=True)

    class Meta:
        unique_together = ("script", "type")
        get_latest_by = "created_on"

    def __str__(self) -> str:
        return f"{self.script}_{self.type}_{self.modification_id}"

# from django.core.files.base import ContentFile
# from .serializers import TitlePageSerializer
# from docx import Document
# from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# from django.http import HttpResponse

# from django.template.loader import render_to_string
# from django.contrib.staticfiles.storage import staticfiles_storage
# import io

# class TitlePage(models.Model):
    
#     FILE_CHOICES = tuple(((k, k) for k in ALLOWED_FILETYPES))
    
#     id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
#     script = models.ForeignKey(Script,on_delete=models.CASCADE)
#     file = models.FileField(upload_to=generate_upload_folder)
#     type = models.CharField(max_length=50, choices=FILE_CHOICES)
#     created_on = models.DateTimeField(auto_now_add=True,null=True,blank=True)
#     # modified_on = models.DateTimeField(auto_now=True,null=True,blank=True)
#     # modification_id = models.IntegerField(default=0, editable=False)
#     class Meta:
#         unique_together = ("script", "type")
#         get_latest_by = "created_on"

# class GetTitlePageAPIView(APIView):
    
#     from django.http import HttpResponse
#     from docx import Document

#     def get(self, request, script_id):
#         try:
#             title = TitlePage.objects.get(script=script_id)
#             file_path = title.file.path

#             # Read the contents of the file
#             doc = Document(file_path)
#             paragraphs = [p.text for p in doc.paragraphs]
            
#             response = {
#                 "Name" : paragraphs[0],
#                 "Author" : paragraphs[1],
#                 "Dialouges" : paragraphs[2]
#             }

#             return Response(response)

#         except TitlePage.DoesNotExist:
#             return HttpResponse('Title page not found', status=404)
        
# from utils.utilities import merge_docx_files, docx_to_pdf
# # from django.conf import settings

# class DownloadScriptWithTitlepage(APIView):
#     def get(self,request,script_id,type):
#         """This API will merge the Titlepage and Script of the given TYPE format

#         Args:
#             request: 
#             script_id (str): script id
#             type (str): file types [pdf,docx,txt]

#         Returns:
#             file : file will be downloaded
#         """
#         file1_path =  TitlePage.objects.get(script=script_id,type="title-docx").file.path
#         file2_path = File.objects.get(
#             script = script_id,
#             type = "script-"+"original"
#         ).file.path
#         doc= merge_docx_files(file1_path,file2_path,'media/audit_folder');
       
#         # Convert the merged document to PDF
#         if type=="pdf":
#             pdf_data = docx_to_pdf(doc)

#             # Create an HTTP response with the PDF file content
#             response = HttpResponse(pdf_data, content_type='application/pdf')
#             response['Content-Disposition'] = 'attachment; filename="merged_script.pdf"'

#             return response   
#         # Save the merged document to a BytesIO buffer
#         buffer = io.BytesIO()
#         doc.save(buffer)
#         buffer.seek(0)

#         response = HttpResponse(buffer, content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
#         response['Content-Disposition'] = 'attachment; filename="sample_docx_file.docx"'
#         return response