/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkottieSlide_DEFINED
#define SkottieSlide_DEFINED

#include "tools/viewer/Slide.h"

#if defined(SK_ENABLE_SKOTTIE)
#include "modules/skottie/include/Skottie.h"
#include "modules/sksg/include/SkSGInvalidationController.h"

#include <vector>

namespace sksg    { class Scene;     }

class SkottieSlide : public Slide {
public:
    SkottieSlide(const SkString& name, const SkString& path);
    ~SkottieSlide() override = default;

    void load(SkScalar winWidth, SkScalar winHeight) override;
    void unload() override;
    void resize(SkScalar, SkScalar) override;

    void draw(SkCanvas*) override;
    bool animate(double) override;

    bool onChar(SkUnichar) override;
    bool onMouse(SkScalar x, SkScalar y, skui::InputState, skui::ModifierKey modifiers) override;

    // Initializes the Skottie animation independent of window size.
    void init();

private:
    SkRect UIArea() const;
    void renderUI();

    class TransformTracker;
    class SlotManagerWrapper;

    const SkString                     fPath;

    sk_sp<skottie::Animation>          fAnimation;
    skottie::Animation::Builder::Stats fAnimationStats;
    sksg::InvalidationController       fInvalController;
    sk_sp<TransformTracker>            fTransformTracker;
    std::unique_ptr<SlotManagerWrapper>fSlotManagerWrapper;
    std::vector<float>                 fFrameTimes;
    SkSize                             fWinSize              = SkSize::MakeEmpty();
    double                             fTimeBase             = 0,
                                       fFrameRate            = 0;
    const char*                        fFrameRateLabel       = nullptr;
    float                              fCurrentFrame         = 0;
    bool                               fShowAnimationInval   = false,
                                       fShowAnimationStats   = false,
                                       fShowUI               = false,
                                       fShowTrackerUI        = false,
                                       fShowSlotManager      = false,
                                       fDraggingProgress     = false,
                                       fPreferGlyphPaths     = false;

    using INHERITED = Slide;
};

#endif // SK_ENABLE_SKOTTIE

#endif // SkottieSlide_DEFINED
