# gpl: authors Carlos Padial, Turi Scandurra

import bpy
import os
from bpy.props import IntProperty
from bpy.types import (
        Operator,
        Panel,
        )
from . import functions


proxy_qualities = [
        ("1", "25%", ""), ("2", "50%", ""),
        ("3", "75%", ""), ("4", "100%", ""),
        ("5", "none", "")
        ]


# functions
def createdatamosh(context, strip):
    preferences = context.preferences
    prefs = preferences.addons[__package__].preferences

    fileinput = bpy.path.abspath(strip.filepath)
    fileoutput = fileinput.rpartition(".")[0] + "_datamosh.avi"

    if prefs.all_keyframes:
        command = "datamosh '{}' -a -o '{}'".format(fileinput, fileoutput)
    else:
        command = "datamosh '{}' -o '{}'".format(fileinput, fileoutput)
    print(command)
    os.system(command)
    return fileoutput


def createavi(context, strip):
    fileinput = bpy.path.abspath(strip.filepath)
    fileoutput = fileinput.rpartition(".")[0] + "_.avi"

    command = "ffmpeg -i '{}' -vcodec copy '{}'".format(fileinput, fileoutput)

    print(command)
    os.system(command)

    return fileoutput


def createavimjpeg(context, strip):
    fileinput = bpy.path.abspath(strip.filepath)
    fileoutput = fileinput.rpartition(".")[0] + "_mjpeg.avi"

    command = "ffmpeg -i '{}' -vcodec mjpeg -q:v 1 '{}'".format(fileinput, fileoutput)

    print(command)
    os.system(command)

    return fileoutput


# classes
class CreateAvi(Operator):
    bl_idname = "sequencer.createavi"
    bl_label = "Create avi file"
    bl_description = "Create an avi output file"
    bl_options = {'REGISTER', 'UNDO'}

    size: IntProperty(
            name="proxysize",
            default=1
            )

    @classmethod
    def poll(self, context):
        strip = functions.act_strip(context)
        scn = context.scene
        if scn and scn.sequence_editor and scn.sequence_editor.active_strip:
            return strip.type in ('MOVIE')
        else:
            return False

    def execute(self, context):
        strips = functions.get_selected_strips(context)

        for strip in strips:
            # deselect all other strips
            for i in strips:
                i.select = False
            # select current strip
            strip.select = True
            if strip.type == "MOVIE":
                if self.size == 1:
                    fileoutput = createavi(context, strip)
                elif self.size == 2:
                    fileoutput = createavimjpeg(context, strip)
                strip.filepath = fileoutput

        # select all strips again
        for strip in strips:
            try:
                strip.select = True
            except ReferenceError:
                pass

        bpy.ops.sequencer.reload()

        return {'FINISHED'}


class CreateDatamosh(Operator):
    bl_idname = "sequencer.createdatamosh"
    bl_label = "Create Datamosh"
    bl_description = "Create Datamosh"

    @classmethod
    def poll(self, context):
        strip = functions.act_strip(context)
        scn = context.scene
        if scn and scn.sequence_editor and scn.sequence_editor.active_strip:
            return strip.type in ('MOVIE')
        else:
            return False

    def execute(self, context):
        preferences = context.preferences
        prefs = preferences.addons[__package__].preferences
        strips = functions.get_selected_strips(context)

        for strip in strips:
            # deselect all other strips
            for i in strips:
                i.select = False
            # select current strip
            strip.select = True
            if strip.type == "MOVIE":
                fileoutput = createdatamosh(context, strip)
                if prefs.load_glitch:
                    strip.filepath = fileoutput

        # select all strips again
        for strip in strips:
            try:
                strip.select = True
            except ReferenceError:
                pass

        bpy.ops.sequencer.reload()

        return {'FINISHED'}


class CreateGlitchToolPanel(Panel):
    bl_label = "Glitch Tools"
    bl_idname = "OBJECT_PT_GlitchTool"
    bl_space_type = 'SEQUENCE_EDITOR'
    bl_region_type = 'UI'

    @classmethod
    def poll(self, context):
        if context.space_data.view_type in {'SEQUENCER',
                                            'SEQUENCER_PREVIEW'}:
            strip = functions.act_strip(context)
            scn = context.scene
            preferences = context.preferences
            prefs = preferences.addons[__package__].preferences
            if scn and scn.sequence_editor and scn.sequence_editor.active_strip:
                if prefs.use_glitch_panel:
                    return strip.type in ('MOVIE')
        else:
            return False

    def draw_header(self, context):
        layout = self.layout
        layout.label(text="", icon="GAME")

    def draw(self, context):

        preferences = context.preferences
        prefs = preferences.addons[__package__].preferences

        layout = self.layout

        layout.operator("sequencer.createavi", text="Create avi (same codec)")
        layout.operator("sequencer.createavi", text="Create avi (mjpeg)").size = 2

        layout.prop(prefs, "all_keyframes")
        layout.prop(prefs, "load_glitch")

        layout.operator("sequencer.createdatamosh")
