"""
============================
Keyframe Color Interpolators
============================

Color animation explained in this tutorial and how to use different color
space interpolators.
"""

import numpy as np

from fury import actor, window
from fury.animation import Animation
from fury.animation.interpolator import (
    hsv_color_interpolator,
    lab_color_interpolator,
    step_interpolator,
    xyz_color_interpolator,
)
from fury.animation.timeline import Timeline
from fury.colormap import distinguishable_colormap

scene = window.Scene()

showm = window.ShowManager(
    scene=scene, size=(900, 768), reset_camera=False, order_transparent=True
)


###############################################################################
# Initializing positions of the cubes that will be color-animated.
cubes_pos = np.array(
    [
        [[-2, 0, 0]],
        [[0, 0, 0]],
        [[2, 0, 0]],
        [[4, 0, 0]],
        [[6, 0, 0]],
    ]
)

###############################################################################
# Static labels for different interpolators (for show)
linear_text = actor.vector_text(text="Linear", pos=(-2.64, -1, 0))
lab_text = actor.vector_text(text="LAB", pos=(-0.37, -1, 0))
hsv_text = actor.vector_text(text="HSV", pos=(1.68, -1, 0))
xyz_text = actor.vector_text(text="XYZ", pos=(3.6, -1, 0))
step_text = actor.vector_text(text="Step", pos=(5.7, -1, 0))
scene.add(step_text, lab_text, linear_text, hsv_text, xyz_text)

###############################################################################
# Creating an animation to animate the actor.
# Also cube actor is provided for each timeline to handle as follows:
# ``Animation(actor)``, ``Animation(list_of_actors)``, or actors can be added
# later using ``animation.add()`` or ``animation.add_actor()``
anim_linear_color = Animation(actors=actor.cube(cubes_pos[0]))
anim_LAB_color = Animation(actors=actor.cube(cubes_pos[1]))
anim_HSV_color = Animation(actors=actor.cube(cubes_pos[2]))
anim_XYZ_color = Animation(actors=actor.cube(cubes_pos[3]))
anim_step_color = Animation(actors=actor.cube(cubes_pos[4]))

###############################################################################
# Creating a timeline to control all the animations (one for each color
# interpolation method)

timeline = Timeline(playback_panel=True)

###############################################################################
# Adding animations to a Timeline.
timeline.add_animation(
    [anim_linear_color, anim_LAB_color, anim_HSV_color, anim_XYZ_color, anim_step_color]
)

###############################################################################
# Setting color keyframes
# =======================
#
# Setting the same color keyframes to all the animations

###############################################################################
# First, we generate some distinguishable colors
colors = distinguishable_colormap(nb_colors=4)

###############################################################################
# Then, we set them as keyframes for the animations
for t in range(0, 20, 5):
    col = colors.pop()
    anim_linear_color.set_color(t, col)
    anim_LAB_color.set_color(t, col)
    anim_HSV_color.set_color(t, col)
    anim_XYZ_color.set_color(t, col)
    anim_step_color.set_color(t, col)

###############################################################################
# Changing the default scale interpolator to be a step interpolator
# The default is linear interpolator for color keyframes
anim_HSV_color.set_color_interpolator(hsv_color_interpolator)
anim_LAB_color.set_color_interpolator(lab_color_interpolator)
anim_step_color.set_color_interpolator(step_interpolator)
anim_XYZ_color.set_color_interpolator(xyz_color_interpolator)

###############################################################################
# Adding the main timeline to the show manager
showm.add_animation(timeline)

interactive = False

if interactive:
    showm.start()

window.record(
    scene=scene, out_path="viz_keyframe_animation_colors.png", size=(900, 768)
)
