import socket
import time
import boto3
import subprocess
import json
import threading
from django.core.management.base import BaseCommand
from django.core.management import call_command
from mnfapp.models import ScriptTranslations
from MNF.settings import BasePath
from conversion.translation.external_conversion import Conversion
from centralisedFileSystem.models import Script, File
from scriptAudit.models import ScriptAuditModel
from scriptAudit.models import States
from utils import filesystem
from scriptAudit.utils import update_audit_status
from scriptAudit.mnf_script_audit import NeutralAudit
from django.core.files.base import ContentFile
from django.contrib.auth import get_user_model
basePath = BasePath()

User = get_user_model()

def background_execution(obj):
    obj.convert()



def run_conversion(msg):
    body_dict = json.loads(msg.body)
    translated_script = ScriptTranslations.objects.get(translation_id=body_dict["translation_id"])
    object_key = "INPUT/" + (translated_script.script_link_id.script.name.split("/"))[-1]
    local_file_path = "/home/ubuntu/Conversion_Kitchen_Code/kitchen_counter/media/" + translated_script.script_link_id.script.name
    s3_client = boto3.client('s3',
                        aws_access_key_id="AKIAQVLBBGCB45RMLKVW",
                        aws_secret_access_key="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",
                        region_name="ap-south-1"
                        )
    s3_client.download_file("conversion-kitchen", object_key, local_file_path)


    conversion_params = {
        "user": translated_script.user_id,
        "file_path": str(basePath) + "/media/" + translated_script.script_link_id.script.name,
        "original_script_id": translated_script.script_link_id.script_id,
        "translated_script_id": translated_script.translation_id,
        "sample_id": body_dict.get('sample_id', None),
        "existing_script": body_dict.get('sample_id', None),
        "iteration_no": body_dict.get('iteration_no', None),
        "juggernaut_pages_deduction": body_dict.get("juggernaut_pages_deduction", None),
        "language_set": body_dict.get("language_set", None),
        "amount_without_subscrption": body_dict.get("amount_without_subscrption", None)
    }
    print("reached here")
    obj = Conversion(**conversion_params)
    # obj.convert()
    background_thread = threading.Thread(target=background_execution, args=(obj,))
    background_thread.start()
    background_thread.join()
    msg.delete()


def run_audit(msg):
    body_dict = json.loads(msg.body)
    user = body_dict.get("user")
    s3_url = body_dict.get("s3-file-path")
    screenplay_name = body_dict.get("screenplay_name")
    author = body_dict.get("author")
    language = body_dict.get("language")
    script_ext = body_dict.get("script_ext")
    script_file_name = body_dict.get("script_file_name")


    object_key = "INPUT/" + str(script_file_name)
    local_file_path = "/home/ubuntu/Conversion_Kitchen_Code/kitchen_counter/media/audit_counter_files/" + script_file_name
    s3_client = boto3.client('s3',
                        aws_access_key_id="AKIAQVLBBGCB45RMLKVW",
                        aws_secret_access_key="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",
                        region_name="ap-south-1"
                        )
    s3_client.download_file("conversion-kitchen", object_key, local_file_path)

    
    with open(local_file_path, 'rb') as file:
        file_content = file.read()
    
    file = ContentFile(
            file_content,
            script_file_name,
    )
    user = User.objects.get(username=user)
    # user_id = user.id
    
    result = filesystem.new_screenplay_without_audit_in_background(
        user,
        author,
        screenplay_name,
        file,
        "script-original",
        language,
    )
    

    script_id = result.get("script", {}).get("id")
        
    file_to_original = File.objects.get(
        script=script_id,
        type="script-original"

    )
    try:
        update_audit_status(script_id, States.STARTED)
    except:
        update_audit_status(script_id, States.FAILURE)


    try:
        naudit = NeutralAudit(script_id)
        naudit.audit()
        ScriptAuditModel.objects.update_or_create(
        script = Script.objects.get(
            id = script_id
        ),
        defaults={"status" : "SUCCESS"}
    )

    except:
        ScriptAuditModel.objects.update_or_create(
        script = Script.objects.get(
            id = script_id
        ),
        defaults={"status" : "FAILURE"}
    )

    msg.delete()
    



class Command(BaseCommand):
    help = 'Custom Command to start django server and then start dequeuing from SQS'

    def handle(self, *args, **options):
        # Call the original runserver command"
        # call_command('runserver', '0.0.0.0:4549')
        command = 'python manage.py runserver 0.0.0.0:4549 > /home/ubuntu/Conversion_Kitchen_Code/logfile.log 2>&1'

        # # Execute the command using subprocess.Popen
        subprocess.Popen(command, shell=True)

        # Wait for the server to start
        while True:
            try:
                # Try to connect to the server
                with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
                    s.connect(('0.0.0.0', 4549))
                    break
            except ConnectionRefusedError:
                # If connection is refused, wait and try again
                time.sleep(1)

        # Once the server is up, run your function
        self.run_after_server_startup()

    def run_after_server_startup(self):
        # Your function to run after the server starts
        print("Development server is fully up and running! Run your function here.")
        
        session = boto3.Session(
            aws_access_key_id='AKIAQVLBBGCB45RMLKVW', # replace with your key
            aws_secret_access_key='ZWc6KOc5LuBLuCEBDDfQTor+Q7rp3fFH74gVt+AA', # replace with your key
        )
        sqs = session.resource('sqs', region_name='ap-south-1')
        
        print("Started Executin this from conversion")
        queue = sqs.get_queue_by_name(QueueName="mnfqueue")
        # try:
        messages = queue.receive_messages(
            MessageAttributeNames=["All"],
            MaxNumberOfMessages=5,
            WaitTimeSeconds=20,
        )
        for msg in messages:
            try:
                print("Received message: %s: %s", msg.message_id, msg.body)
                print(type(msg.body))
                body_dict = json.loads(msg.body)
                if body_dict['service_type'] == "conversion":

                    run_conversion(msg)
                
                elif body_dict['service_type'] == "audit":

                    run_audit(msg)

            except Exception as error:
                print("error execution from queue: %s", error)
        

        print("Completed All Execution")