from subprocess import run, CalledProcessError
import os
from fastapi import UploadFile
import shutil

# Define FFmpeg path
FFMPEG_PATH = "/SRT/ffmpeg-5.1.1-amd64-static/ffmpeg"

async def process_video(country: str, channel: str, file: UploadFile) -> str:
    # Create directories if they don't exist
    upload_dir = os.path.join("/var/www/html/Web_Transcoder", "uploads")
    processed_dir = os.path.join("/var/www/html/Web_Transcoder", "processed_videos")
    os.makedirs(upload_dir, exist_ok=True)
    os.makedirs(processed_dir, exist_ok=True)

    # Save the uploaded file
    temp_file_path = os.path.join(upload_dir, file.filename)
    with open(temp_file_path, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)

    # Modify the output filename to ensure .ts extension
    base_filename = file.filename.rsplit('.', 1)[0]  # Remove original extension
    output_filename = f"processed_{country}_{channel}_{base_filename}.ts"
    output_file_path = os.path.join(processed_dir, output_filename)

    # Define ffmpeg command based on country and channel
    ffmpeg_command = [
        FFMPEG_PATH,
        '-i', temp_file_path
    ]

    if country == 'France':
        if channel == '2M':
            ffmpeg_command = [
                FFMPEG_PATH,
                '-i', temp_file_path,
                '-itsoffset', '0.01',
                '-i', temp_file_path,
                '-map', '0:v:0',
                '-map', '1:a:0',
                '-c:v', 'libx264',
                '-b:v', '3000k',
                '-minrate:v', '3000k',
                '-maxrate:v', '3000k',
                '-bufsize:v', '1500k',
                '-vf', 'scale=720:576,setsar=16/11',
                '-r', '25',
                '-aspect', '20:11',
                '-profile:v', 'main',
                '-level:v', '3.0',
                '-x264opts', 'no-scenecut:nal-hrd=cbr:force-cfr=1:keyint=25:min-keyint=25',
                '-flags', '+ilme+ildct',
                '-field_order', 'tt',
                '-colorspace', '1',
                '-color_primaries', '1',
                '-color_trc', '1',
                '-c:a', 'mp2',
                '-b:a', '128k',
                '-ar', '48000',
                '-ac', '2',
                '-preset', 'slow',
                '-muxrate', '3362k',
                '-streamid', '0:0x101',
                '-streamid', '1:0x102',
                '-metadata:s:v:0', 'service_id=0x100',
                '-metadata:s:v:0', 'service_provider=Digital TV',
                '-metadata:s:v:0', 'service_name=Digital TV',
                '-metadata:s:v:0', 'service_type=digital television',
                '-f', 'mpegts'
            ]
        elif channel == 'El Hiwar':
            ffmpeg_command = [
                FFMPEG_PATH,
                '-i', temp_file_path,
                '-c:v', 'mpeg2video',
                '-b:v', '3679k',
                '-maxrate', '3846k',
                '-bufsize', '7342k',
                '-r', '25',
                '-s', '720x576',
                '-aspect', '16:9',
                '-pix_fmt', 'yuv420p',
                '-flags', '+ilme+ildct',
                '-top', '1',
                '-c:a', 'mp2',
                '-b:a', '128k',
                '-ar', '48000',
                '-ac', '2',
                '-muxrate', '4007k',
                '-f', 'mpegts'
            ]
    elif country == 'Belgium':
        if channel == '2M':
            ffmpeg_command = [
                FFMPEG_PATH,
                '-i', temp_file_path,
                '-itsoffset', '0.01',
                '-i', temp_file_path,
                '-map', '0:v:0',
                '-map', '1:a:0',
                '-c:v', 'libx264',
                '-b:v', '4615k',
                '-minrate:v', '4615k',
                '-maxrate:v', '4615k',
                '-bufsize:v', '9230k',
                '-vf', 'scale=1920:1080,setsar=1:1',
                '-r', '25',
                '-aspect', '16:9',
                '-profile:v', 'high',
                '-level:v', '4.0',
                '-x264opts', 'no-scenecut:nal-hrd=cbr:force-cfr=1:keyint=24:min-keyint=24:ref=4:rc-lookahead=24',
                '-flags', '+ilme+ildct',
                '-field_order', 'tt',
                '-colorspace', 'bt709',
                '-color_primaries', 'bt709',
                '-color_trc', 'bt709',
                '-color_range', 'tv',
                '-pix_fmt', 'yuv420p',
                '-c:a', 'mp2',
                '-b:a', '192k',
                '-ar', '48000',
                '-ac', '2',
                '-preset', 'medium',
                '-muxrate', '5059k',
                '-streamid', '0:0x100',
                '-streamid', '1:0x101',
                '-metadata:s:v:0', 'service_id=0x1000',
                '-metadata:s:v:0', 'service_provider=Adtlas Digital TV',
                '-metadata:s:v:0', 'service_name=Adtlas Transcoding',
                '-metadata:s:v:0', 'service_type=digital television',
                '-f', 'mpegts'
            ]
    elif country == 'Netherlands':
        if channel == '2M':
            ffmpeg_command = [
                FFMPEG_PATH,
                '-i', temp_file_path,
                '-itsoffset', '0.01',
                '-i', temp_file_path,
                '-map', '0:v:0',
                '-map', '1:a:0',
                '-c:v', 'libx264',
                '-b:v', '3000k',
                '-minrate:v', '3000k',
                '-maxrate:v', '3000k',
                '-bufsize:v', '1500k',
                '-vf', 'scale=720:576,setsar=16/11',
                '-r', '25',
                '-aspect', '20:11',
                '-profile:v', 'main',
                '-level:v', '3.0',
                '-x264opts', 'no-scenecut:nal-hrd=cbr:force-cfr=1:keyint=25:min-keyint=25',
                '-flags', '+ilme+ildct',
                '-field_order', 'tt',
                '-colorspace', '1',
                '-color_primaries', '1',
                '-color_trc', '1',
                '-c:a', 'mp2',
                '-b:a', '128k',
                '-ar', '48000',
                '-ac', '2',
                '-preset', 'slow',
                '-muxrate', '3362k',
                '-streamid', '0:0x101',
                '-streamid', '1:0x102',
                '-metadata:s:v:0', 'service_id=0x100',
                '-metadata:s:v:0', 'service_provider=Digital TV',
                '-metadata:s:v:0', 'service_name=Digital TV',
                '-metadata:s:v:0', 'service_type=digital television',
                '-f', 'mpegts'
            ]

    ffmpeg_command.append(output_file_path)

    try:
        run(ffmpeg_command, check=True)
        # Clean up the temporary file
        os.remove(temp_file_path)
    except CalledProcessError as e:
        # Clean up on error
        if os.path.exists(temp_file_path):
            os.remove(temp_file_path)
        raise RuntimeError(f"Error processing video: {e}")

    return f"/processed/{output_filename}"