import os
from dataclasses import dataclass
from django.http import JsonResponse
from .models import Job
from .serializer import ResponseSerializer
from rest_framework.decorators import api_view
from rest_framework import status
from django.core.mail import send_mail
from datetime import datetime
import torch
from script import schicatt_infer as model
import threading

N = 16

BASE_URL = "http://biomlearn.uccs.edu:8082"
BASE_DIR = '/var/www/html/Data/schicatt/jobs'
REQUEST_PREFIX = 'request_'
RESPONSE_PREFIX = 'response_'
FILE_EXT = '.txt'
email_footer = f"\n\nFor questions, Contact\nOluwatosin Oluwadare, PhD\nDepartment of Computer Science University of Colorado,\nColorado Springs\nEmail: ooluwada@uccs.edu"

@api_view(['POST'])
def create_job(request):
    email = request.POST.get('email')
    model_name = request.POST.get('model_name')
    if request.FILES.get('file_data', False):
        file_data = request.FILES['file_data']

    job_id = f"{email}_{str(int(datetime.now().timestamp()))}"

    data_dir = f"{BASE_DIR}/{job_id}/"
    if not os.path.exists(data_dir):
        os.makedirs(data_dir)

    filename = ""
    if file_data is not None:
        filename = file_data.name
        with open(data_dir + filename, 'wb+') as file:
            for chunk in file_data.chunks():
                file.write(chunk)
            file.flush()
            file.close()

    job = Job()
    job.reference = job_id
    job.email = email
    job.model_name = model_name
    job.data_dir = data_dir
    job.save()

    
    message = f"Thank you for your submission. We have received your job, and it has been added to a queue. We will notify you once the job is completed.{email_footer}"
    send_mail('ScHiCAtt Job Submitted', message,
              'oluwadarelabresearch@gmail.com', [email])

    input = f"{BASE_DIR}/{job_id}/{filename}"
    checkpoint = "/var/www/html/Data/schicatt/models/human_model_best.pytorch"
    if model_name == "homo_sapiens":
        checkpoint = "/var/www/html/Data/schicatt/models/human_model_best.pytorch"
    elif model_name == "drosophila":
        checkpoint = "/var/www/html/Data/schicatt/models/dros_model_final.pytorch"
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    multi_chrom = f""
    output = f"{BASE_DIR}/{job_id}"
    thread = threading.Thread(target=async_run_inference, args=(
        input, checkpoint, output, multi_chrom, device, email, job_id))
    thread.start()
    serialized_job = ResponseSerializer(job).data
    return JsonResponse(serialized_job,
                        status=status.HTTP_201_CREATED,
                        safe=False)


def async_run_inference(input, checkpoint, output, multi_chrom, device, email, job_id):
    model.run_inference(input, checkpoint, output, multi_chrom, device)
    result_path = f"http://biomlearn.uccs.edu/Data/schicatt/jobs/{job_id}"
    
    send_mail(
        "ScHiCAtt Job Completed",
        "Job result available at " + result_path + email_footer,
        "oluwadarelabresearch@gmail.com",
        [email],
    )
