from django.shortcuts import render, redirect
from django.contrib import auth
from .models import admin
import os 
from datetime import datetime
from moviepy.editor import VideoFileClip
import sys
from pydub import AudioSegment
from pydub.silence import detect_nonsilent
import pandas as pd
import audiofile
import speech_recognition as sr
from .models import *


def transcribe_audio(audio_file):
    recognizer = sr.Recognizer()

    with sr.AudioFile(audio_file) as source:
        audio = recognizer.record(source)

    try:
        result = recognizer.recognize_google(audio, language='ar-MA', show_all=True)
        if result and 'alternative' in result:
            best_transcription = result['alternative'][0]['transcript']
            return best_transcription
        return None
    except sr.UnknownValueError:
        print("Could not understand the audio")
        return None
    except sr.RequestError as e:
        print(f"Could not request results from Google Speech Recognition service; {e}")
        return None

def process_video(input_file, min_silence_len=1000, silence_thresh=-36, min_duration=2, use_min_duration=True):
    # Load video and extract audio
    video = VideoFileClip(input_file)
    audio = video.audio

    # Save audio to a temporary WAV file
    audio.write_audiofile("temp_audio1.wav")

    # Load audio using pydub
    audio_segment = AudioSegment.from_wav("temp_audio1.wav")
    os.remove("temp_audio1.wav")

    # Detect non-silent intervals
    nonsilent_intervals = detect_nonsilent(audio_segment, min_silence_len, silence_thresh)

    # Create output folder
    video_name = os.path.splitext(os.path.basename(input_file))[0]
    output_folder = f"{video_name}_output"
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # Cut video into chunks and save metadata
    metadata = []
    part_number = 0
    for start, end in nonsilent_intervals:
        start_time = start / 1000
        end_time = end / 1000
        duration = end_time - start_time

        # Check if the duration is longer than the minimum duration
        if use_min_duration and duration < min_duration:
            continue

        part_number += 1
        output_file = os.path.join(output_folder, f"{video_name}_part_{part_number}.mp4")

        # Cut video and write to file
        video_chunk = video.subclip(start_time, end_time)
        video_chunk.write_videofile(output_file)

        # Extract audio from the video chunk and transcribe
        audio_chunk = video_chunk.audio
        audio_chunk.write_audiofile("temp_audio_chunk.wav")
        transcription = transcribe_audio("temp_audio_chunk.wav")
        os.remove("temp_audio_chunk.wav")

        metadata.append({
            "filename": output_file,
            "start_at": start_time,
            "end_at": end_time,
            "transcription": transcription,
        })

    # Save metadata to Excel file
    df = pd.DataFrame(metadata)
    df.to_excel(os.path.join(output_folder, f"{video_name}_metadata.xlsx"), index=False)
    print("Video processing completed")

def home(request):
    return render(request, 'home.html')

# def admin_login(request):
#     if request.method == 'POST':
#         username = request.POST['username']
#         password = request.POST['password']
#         user = auth.authenticate(username=username, password=password)
#         if user is not None:
#             auth.login(request, user)
#             return redirect('upload')
#         else:
#             error_msg = 'Wrong username or password!'
#             return render(request, 'admin_login.html', {'error_msg': error_msg})
#     else:
#         return render(request, 'admin_login.html')


def admin_login(request):
    if request.method == 'POST':
        now=datetime.now()
        username = request.POST['username']
        password = request.POST['password']
        print('the username is :',username)
        print('the password is :',password)
        try:
            data=admin.objects.filter(username=username).get(password=password)
        except admin.DoesNotExist:
            error_msg = 'Wrong username or password!'
            return render(request, 'admin_login.html', {'error_msg': error_msg})
        print('the data is ', data)
            
        if data:
            #request.session['islogged'] = 'yes'
            request.session['id_admin'] = str(data.id_admin)
            data.last_time=str(now).split('.')[0]
            data.save()
            return redirect('upload')
        else:
            return render(request, 'admin_login.html', {'error_msg': "Error detected."})
            
    else:
        return render(request, 'admin_login.html')


# def upload(request):
#     return render(request, 'upload.html')


def handle_uploaded_file(file, path, filename):
    # with open(path+"/"+filename, 'wb+') as destination:
    with open(filename, 'wb+') as destination:
        # for chunk in file.chunks():
        #     destination.write(chunk)

    #with open(image_path, 'wb+') as destination:
        if type(file) == str:
            destination.write(file.encode())   # or whatever you actually want to do if it's a string
        else:
            for chunk in file.chunks():
                destination.write(chunk)

def save_video(content,filename):
    #video =request.POST.get('filename')
    # video_path="media/"+filename
    # clip = VideoFileClip("media/"+filename)
    video_name=filename
    path=filename
    clip = VideoFileClip(filename)
    duration=clip.duration
    extension= filename.split('.')[-1]
    user_instance = user.objects.get(id_user=2)
    now=datetime.now()
    when_uploaded=str(now).split('.')[0]
    
    #print('the video name is :',video)
    new_video = video(video_name=video_name,when_uploaded=when_uploaded,id_user=user_instance,path=path,duration=duration,extension=extension)
    new_video.save()


def upload(request):
    if request.method == 'POST':
        my_str= request.FILES['filename'].name
        
        filename= my_str #re.sub(r'^[0-9a-zA-Z._-]+', '', my_str).replace(' ','_').replace('(','').replace(')','')
        content = request.FILES['filename']

       # objects=Files()
        print('the file name is :',filename)
        #path = "media/"
        path="/"
        if not os.path.exists(path):
            os.makedirs(path)
        handle_uploaded_file(content, path, filename)
        #save_video(content,filename)
        process_video(filename, min_silence_len=1000, silence_thresh=-36, min_duration=2, use_min_duration=True)
        return render(request , "list.html" )

    return render(request , "upload.html" )

