import os
from posixpath import ismount
import sys
import time
import subprocess
import datetime
import shutil
import json
import getopt
from ffmpeg_progress_yield import FfmpegProgress
from tqdm import tqdm

if sys.platform == "linux" or sys.platform == "linux2":
    # linux
    ops =  "linux"
elif sys.platform == "darwin":
    # OS X
    ops =  "osx"
elif sys.platform == "win32":
    ops =  "win"
try:
    opts, args = getopt.getopt(sys.argv[1:], "ta:r:fp:d:s:", ["command=", "help", "output=", "backup"])
except getopt.GetoptError as err:
    # print help information and exit:
    print(str(err))  # will print something like "option -a not recognized"
    #usage()
    sys.exit(2)
output = None
# QJ : getopts
_DEV = "gopro9_1"
_SEQUENCES = []
_FLIP = False
_TEST = False
if ops == "win":
    _SOURCE_DIR = "p:\\imported\\"
else:
    _SOURCE_DIR = "/share/Photo/imported/"
for o, a in opts:
    if o == "-h":
        _ACTION = True
    elif o in ("-d", "--device"):
        _DEV = True
    elif o in ("-p", "--part"):
        _DAY_DIR = a
    elif o in ("-f", "--flip"):
        _FLIP = True
    elif o in ("-r", "--source"):
        _SOURCE_DIR = a
    elif o in ("-a", "--action"):
        _ACTION = a
    elif o in ("-t", "--test"):
        _TEST = True
    elif o in ("-s", "--sequence"):
        a = a.split(",")
        for s in a:
            print(s)
            _SEQUENCES.append("{:04d}".format(int(s)))
            

    else:
        _WIZZARD = True
        
#_SOURCE_DIR = "/media/nas/nas-photo/imported/"

if ops == "win":
    _FULL_PATH = _SOURCE_DIR + "\\" + _DEV + "\\" + _DAY_DIR + "\\"
else:
    _FULL_PATH = _SOURCE_DIR + "/" + _DEV + "/" + _DAY_DIR + "/"



#print(_FULL_PATH)

if _ACTION == "join":
    video_seq = {}

    if os.path.exists(_FULL_PATH):
        if os.path.exists(_FULL_PATH + "100GOPRO"):
            _FULL_PATH = _FULL_PATH + "100GOPRO"
        for filename in os.listdir(_FULL_PATH):
            if filename.endswith(".MP4"):
                prefix = filename[0:2]
                part = prefix + filename[2:4]
                seq = filename[4:8]
                if not seq in video_seq:
                    video_seq[seq] = []
                video_seq[seq].append(part + seq + ".MP4")
                # print(filename)
                # print(seq)
                # print(part)
        # print(json.dumps(video_seq,indent=2))
        _PROCESSED = _FULL_PATH + "processed"
        if not os.path.exists(_PROCESSED):
            os.mkdir(_PROCESSED)
        # print(f"SEQUENCES : {_SEQUENCES}")
        
        for vid in video_seq:
            
            if len(_SEQUENCES) != 0 and vid not in _SEQUENCES:
                continue
            export_name = "joined_"  + vid + ".MP4"
            parts = video_seq[vid]
            
            parts.sort()
            # print(parts)
            if len(parts) > 1:
                print("This need to be joined!")
                # for p in parts:
                #     join_string =
            else:
            #     continue
            # print(parts)
                shutil.move(parts[0], export_name)
                continue
            # print(type(parts))
            #ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4
            
            os.chdir(_FULL_PATH)
            f = open("video.txt", "w")
            f.write("# Files to join\n")
            f.close()
            f = open("video.txt", "a")
            final_size = 0
            for p in parts:
                f.write(f"file '{p}'\n")
                file_stats = os.stat(p)
                final_size += file_stats.st_size / (1024 * 1024)
            f.close()   
            print(final_size)
            print(_FULL_PATH)
            with tqdm(total=100, position=1, desc="Join") as pbar:
                while True:
                    pbar.update(1)
                    file_stats = os.stat(export_name)
                    print(file_stats.st_size )
                    time.sleep(1)
            if _TEST:
                input(" ???? ")
            # if _FLIP:
            #     if ops == "win":
            #         myCmd = 'ffmpeg -display_rotation 180 -f concat -i video.txt -vcodec copy -acodec copy ' + export_name
            #     else:
            #         myCmd = '/opt/ffmpeg/ffmpeg -display_rotation 180 -f concat -i video.txt -vcodec copy -acodec copy ' + export_name
            # else:
            #     if ops == "win":
            #         myCmd = 'ffmpeg -f concat -i video.txt -vcodec copy -acodec copy ' + export_name
            #     else:
            #         myCmd = '/opt/ffmpeg/ffmpeg -f concat -i video.txt -vcodec copy -acodec copy ' + export_name
                    
                    
                    
                    
                    

            # print(os.getcwd())
            #status, output = subprocess.getstatusoutput(myCmd)
            
            if _FLIP:
                if ops == "win":
                    myCmd =  [
                "ffmpeg", "-display_rotation", "180", "-f", "concat", "-i", "video.txt ","-vcodec", "copy", "-acodec", "copy", export_name, "null", "/dev/null",
            ]
                else:
                    myCmd =  [
                "/opt/ffmpeg/ffmpeg", "-display_rotation", "180", "-f", "concat", "-i", "video.txt ","-vcodec", "copy", "-acodec", "copy", export_name, "null", "/dev/null",
            ]
            else:
                if ops == "win":
                    myCmd =  [
                "ffmpeg", "-f", "concat", "-i", "video.txt ","-vcodec", "copy", "-acodec", "copy", export_name , "null", "/dev/null",
            ]
                else:
                    myCmd =  [
                "/opt/ffmpeg/ffmpeg", "-f", "concat", "-i", "video.txt ","-vcodec", "copy", "-acodec", "copy", export_name , "null", "/dev/null",
            ]
                            
            print(myCmd)
            print(f"Joining {len(parts)} files...")
            ff = FfmpegProgress(myCmd)
            # with tqdm(total=100, position=1, desc="Convert") as pbar:
            #     for progress in ff.run_command_with_progress():
            #         pbar.update(progress - pbar.n)
                    
            file_stats = os.stat(file_name)  

            # get the output
            print(ff.stderr)
            status = 0
            if status == 0:
                print("Moving...")
                for p in parts:
                    try:
                        shutil.move(p, _PROCESSED)
                    except:
                        print(f"Failed to move {p}")
                    try:
                        shutil.move(p.replace("MP4", "THM"), _PROCESSED)
                    except:
                        print(f"Failed to move {p.replace("MP4", "THM")}")
                        
                    try:
                        shutil.move(p.replace("MP4", "LRV").replace("GH","GL"), _PROCESSED)
                    except:
                        print(f"Failed to move {p.replace("MP4", "LRV")}")
        os.remove("video.txt") 
        
if _ACTION == "encode":
    if os.path.exists(_FULL_PATH):
        if os.path.exists(_FULL_PATH + "100GOPRO"):
            _FULL_PATH = _FULL_PATH + "100GOPRO"
        parts = []
        for filename in os.listdir(_FULL_PATH):
            if filename.startswith("joined_") and filename.endswith(".MP4"):
                parts.append(filename)
    else:
        sys.exit()
            
            

    for p in parts:
        export_name = "encoded_" + p
        if _FLIP:
            if ops == "win":
                myCmd =  [
            "ffmpeg", "-display_rotation", "180", "-i", p, "-c:v", "hevc_amf", "-rc", "cqp", "-qp_i", "42", "-qp_p", "42", "-quality", "quality", "-crf", "25", export_name, "-f", "null", "/dev/null",
        ]
            else:
                myCmd =  [
            "/opt/ffmpeg/ffmpeg", "-display_rotation", "180",  "-i", p, "-c:v", "hevc_amf", "-rc", "cqp", "-qp_i", "42", "-qp_p", "42", "-quality", "quality", "-crf", "25", export_name, "-f", "null", "/dev/null",
        ]
        else:
            if ops == "win":
                myCmd =  [
            "ffmpeg", "-i", p, "-c:v", "hevc_amf", "-rc", "cqp", "-qp_i", "42", "-qp_p", "42", "-quality", "quality", "-crf", "25", export_name , "-f", "null", "/dev/null",
        ]
            else:
                myCmd =  [
            "/opt/ffmpeg/ffmpeg", "-i", p, "-c:v", "hevc_amf", "-rc", "cqp", "-qp_i", "42", "-qp_p", "42", "-quality", "quality", "-crf", "25", export_name , "-f", "null", "/dev/null",
        ]
        print(myCmd)
        print(f"Encoding files...")
        ff = FfmpegProgress(myCmd)
        with tqdm(total=100, position=1, desc="Convert") as pbar:
            for progress in ff.run_command_with_progress():
                pbar.update(progress - pbar.n)

        # get the output
        print(ff.stderr)                      
        #ffmpeg  -i .\GH010149.MP4  -c:v hevc_amf -rc cqp -qp_i 42 -qp_p 42 -quality quality -crf 25 output7.mp4
    
    
    