import os
import gradio as gr
import torch
import whisper
from TTS.api import TTS
from torch.serialization import add_safe_globals
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import XttsAudioConfig, XttsArgs
from TTS.config.shared_configs import BaseDatasetConfig
from fetch_data import get_botpress_response
import requests, os, json
import warnings
import gradio as gr
import librosa
import torch
import numpy as np
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
import assemblyai as aai
warnings.filterwarnings("ignore")

# Load model and processor
processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h")
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h")

def process_media(media_id, access_token, phone_no_id, phone_no,business_id):
    """Process media ID to send audio message."""
    # Fetch media URL
    media_url = get_media_url(media_id, access_token, phone_no_id)
    if not media_url:
        return "Failed to fetch media URL."

    # Download the voice note
    audio_path = download_voice_note(media_url, access_token)
    if not audio_path:
        return "Failed to download voice note."

    # Transcribe audio
    transcription = audio_transcribe(audio_path)
    if not transcription:
        return "Hi"
    return transcription

def audio_transcribe(audio_path):
    try:
        # Load and preprocess audio
        aai.settings.api_key = "c3db74329eea4ff68b95888dca1e2d72"
        transcriber = aai.Transcriber()
        transcript = transcriber.transcribe(audio_path)
        
        return transcript.text
    except Exception as e:
        return f"Error: {str(e)}"


def get_media_url(media_id, access_token, phone_no_id):
    """Fetch media URL from Facebook Graph API."""
    url = f"https://graph.facebook.com/v21.0/{media_id}?phone_number_id={phone_no_id}"
    headers = {'Authorization': f'Bearer {access_token}'}

    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.json().get('url', None)
    return None

def download_voice_note(url, access_token):
    """Download a voice note and store it in the current directory."""
    headers = {"Authorization": f"Bearer {access_token}"}
    
    response = requests.get(url, headers=headers, stream=True)
    if response.status_code == 200:
        file_name = "voice_note.mp3"
        file_path = os.path.join(os.getcwd(), file_name)  # Save to current directory

        with open(file_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)

        print(f"✅ Download complete: {file_path}")
        return file_path
    else:
        print(f"❌ Failed to download file. Status code: {response.status_code}")
        return None

def upload_audio(audio_path, access_token, phone_no_id):
    """Upload an audio file to WhatsApp Business API."""
    url = f"https://graph.facebook.com/v21.0/{phone_no_id}/media"
    payload = {'messaging_product': 'whatsapp'}

    with open(audio_path, 'rb') as audio_file:
        files = [('file', ('output.ogg', audio_file, 'audio/ogg'))]
        headers = {'Authorization': f'Bearer {access_token}'}

        response = requests.post(url, headers=headers, data=payload, files=files)
        print(f"response is {response.text}")
        return response.json().get('id', None)

def send_audio(phone_no, audio_id, access_token, phone_no_id):
    """Send an audio message via WhatsApp API."""
    url = f"https://graph.facebook.com/v21.0/{phone_no_id}/messages"

    payload = json.dumps({
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": phone_no,
        "type": "audio",
        "audio": {"id": audio_id}
    })
    headers = {'Content-Type': 'application/json', 'Authorization': f'Bearer {access_token}'}

    try:
        response = requests.post(url, headers=headers, data=payload)
        response.raise_for_status()
        print(response.text)
        return response.json()
    except requests.exceptions.RequestException as e:
        return str(e)

# Gradio Interface
iface = gr.Interface(
    fn=process_media,
    inputs=[
        gr.Textbox(label="Media ID"),
        gr.Textbox(label="Access Token"),
        gr.Textbox(label="Phone Number ID"),
        gr.Textbox(label="Recipient Phone Number"),
        gr.Textbox(label="Business ID")
    ],
    outputs="text",
    title="WhatsApp Audio Processor",
    description="Enter Media ID, Access Token, Phone Number ID, and Recipient Phone Number to process and send audio."
)
iface.launch(debug=True)