# -*- coding: utf-8 -*-
"""
====
Card
====

This example shows how to create a card and use a sprite
sheet to update the image in the card.

First, some imports.
"""

import fury
import os
from tempfile import TemporaryDirectory as InTemporaryDirectory

from fury.data import fetch_viz_icons
from fury.io import load_image, load_sprite_sheet, save_image

##############################################################################
# First we need to fetch some icons that are included in FURY.

TARGET_FPS = 15
FRAME_TIME = (1.0 / TARGET_FPS) * 1000

fetch_viz_icons()

sprite_sheet = load_sprite_sheet(
    "https://raw.githubusercontent.com/fury-gl/"
    "fury-data/master/unittests/fury_sprite.png",
    5,
    5,
)
CURRENT_SPRITE_IDX = 0

vtk_sprites = []
###############################################################################
# Let's create a card and add it to the show manager

img_url = (
    "https://raw.githubusercontent.com/fury-gl"
    "/fury-communication-assets/main/fury-logo.png"
)

title = "FURY"
body = (
    "FURY - Free Unified Rendering in pYthon."
    "A software library for scientific visualization in Python."
)

card = fury.ui.elements.Card2D(
    image_path=img_url,
    title_text=title,
    body_text=body,
    image_scale=0.55,
    size=(300, 300),
    bg_color=(1, 0.294, 0.180),
    bg_opacity=0.8,
    border_width=5,
    border_color=(0.1, 0.4, 0.8),
)

###############################################################################
# Now we define the callback to update the image on card after some delay.


def timer_callback(_obj, _evt):
    global CURRENT_SPRITE_IDX, show_manager
    CURRENT_SPRITE_IDX += 1
    sprite = vtk_sprites[CURRENT_SPRITE_IDX % len(vtk_sprites)]
    card.image.set_img(sprite)
    i_ren = show_manager.scene.GetRenderWindow().GetInteractor().GetInteractorStyle()

    i_ren.force_render()


###############################################################################
# Lets create a function to convert the sprite to vtkImageData


def sprite_to_vtk():
    with InTemporaryDirectory() as tdir:
        for idx, sprite in enumerate(list(sprite_sheet.values())):
            sprite_path = os.path.join(tdir, f"{idx}.png")
            save_image(sprite, sprite_path, compression_quality=100)
            vtk_sprite = load_image(sprite_path, as_vtktype=True)
            vtk_sprites.append(vtk_sprite)


###############################################################################
# Now that the card has been initialised, we add it to the show
# manager.

current_size = (1000, 1000)
show_manager = fury.window.ShowManager(size=current_size, title="FURY Card Example")

show_manager.scene.add(card)
show_manager.initialize()
###############################################################################
# Converting numpy array sprites to vtk images
sprite_to_vtk()

###############################################################################
# Adding a timer to update the card image
show_manager.add_timer_callback(True, int(FRAME_TIME), timer_callback)

# To interact with the UI, set interactive = True
interactive = False

if interactive:
    show_manager.start()

fury.window.record(scene=show_manager.scene, out_path="card_ui.png", size=(1000, 1000))
