import json
from threading import Thread
from celery import shared_task
import logging

from apps.accounts.models import User 

from apps.process.utils import get_sec
from apps.process.inference import VocalRemover
from apps.process.handler import start_removing_sounds
from apps.process.models import ProcessedMedia, Media, Status

# Create a logger for this file
logger = logging.getLogger(__file__)

MLmodel = VocalRemover(device="cuda", model_weights="weights/baseline.pth")

@shared_task(name='ML Sound Task')
def convert(filename, parts, media_id, user_id):
    logger.info(f"File Name: {filename}")
    parts = json.loads(parts)
    # Test if The Parts Are Existing
    ms_parts = []
    for part in parts:
        ms_parts.append([get_sec(part[0]),get_sec(part[1])])

    final_video            = ProcessedMedia()
    final_video.user       = User.objects.get(id=user_id)
    final_video.parts      = ms_parts
    final_video.status     = Status.Processing
    final_video.media      = Media.objects.get(id_media=media_id)
    final_video.save()
    
    # Start The Thread For The Pre-processing ::
    t = Thread(target=start_removing_sounds, args=(MLmodel, ms_parts, filename, final_video.id))
    t.start()
    return final_video.id