import matplotlib.pyplot as plt
# from mpl_toolkits.mplot3d import Axes3D
# from matplotlib.collections import LineCollection, PolyCollection
# from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from matplotlib import animation

from tempfile import NamedTemporaryFile

VIDEO_TAG = """<video controls loop>
 <source src="data:video/x-m4v;base64,{0}" type="video/mp4">
 Your browser does not support the video tag.
</video>"""

def anim_to_html(anim):
    """
    adapted from: http://jakevdp.github.io/blog/2013/05/12/embedding-matplotlib-animations/

    This function converts and animation object from matplotlib into HTML which can then
    be embedded in an IPython notebook.

    This requires ffmpeg to be installed in order to build the intermediate mp4 file

    To get these to display automatically, you need to set animation.Animation._repr_html_ = plotlib.anim_to_html
    (this is done on your behalf by PHOEBE)
    """
    if not hasattr(anim, '_encoded_video'):
        with NamedTemporaryFile(suffix='.mp4') as f:
            anim.save(f.name, fps=20, extra_args=['-vcodec', 'libx264'])
            video = open(f.name, "rb").read()
        anim._encoded_video = video.encode("base64")

    return VIDEO_TAG.format(anim._encoded_video)

# setup hooks for inline animations in IPython notebooks
try:
    from JSAnimation import IPython_display
except:
    # built-in mp4 support
    animation.Animation._repr_html_ = anim_to_html


class Animation(object):
    def __init__(self, affig, tight_layout=True,
                 draw_sidebars=True, draw_title=True,
                 subplot_grid=None, animate_callback=None):
        self.affig = affig
        self.mplfig = affig._get_backend_object()
        self.mplfig.clf()

        self.tight_layout = tight_layout
        self.draw_sidebars = draw_sidebars
        self.draw_title = draw_title
        self.subplot_grid = subplot_grid
        self.animate_callback = animate_callback

    def anim_init(self):
        return self.affig._get_backend_artists()

    def __call__(self, i):
        # print("***Animation.__call__(indep={})".format(indep))
        for mplax in self.mplfig.axes:
            mplax.cla()

        mplfig = self.affig.draw(i=i,
                                 tight_layout=self.tight_layout,
                                 draw_sidebars=self.draw_sidebars,
                                 draw_title=self.draw_title,
                                 subplot_grid=self.subplot_grid,
                                 in_animation=i+1)

        if self.animate_callback is not None:
            self.animate_callback(mplfig)

        return self.affig._get_backend_artists()