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

#include "include/core/SkTypes.h"

#if defined(SK_ENABLE_SVG)

#include "include/core/SkCanvas.h"
#include "include/core/SkRect.h"
#include "include/core/SkStream.h"
#include "modules/skshaper/utils/FactoryHelpers.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "modules/svg/include/SkSVGNode.h"
#include "src/core/SkOSFile.h"
#include "src/utils/SkOSPath.h"
#include "src/xml/SkDOM.h"
#include "tools/Resources.h"
#include "tools/fonts/FontToolUtils.h"
#include "tools/viewer/Slide.h"

namespace {
class AnimatedSVGSlide : public Slide {
    inline static constexpr auto kAnimationIterations = 5;
    enum State {
        kZoomIn,
        kScroll,
        kZoomOut
    };
    sk_sp<SkSVGDOM> fDom;
    const char*     fResource = nullptr;
    State           fState = kZoomIn;
    int             fAnimationLoop = kAnimationIterations;
    SkScalar        fDelta = 1;

public:
    AnimatedSVGSlide(const char* r, const char* n) : fResource(r) { fName = n; }

    void load(SkScalar w, SkScalar h) override {
        SkASSERT(fResource);
        auto data = GetResourceAsData(fResource);
        if (!data) {
            SkDebugf("Resource not found: \"%s\"\n", fResource);
            return;
        }
        SkMemoryStream svgStream(std::move(data));

        fDom = SkSVGDOM::Builder()
                       .setFontManager(ToolUtils::TestFontMgr())
                       .setTextShapingFactory(SkShapers::BestAvailable())
                       .make(svgStream);
        if (fDom) {
            fDom->setContainerSize(SkSize::Make(w, h));
        }
    }

    void draw(SkCanvas* canvas) override {
        if (fDom) {
            canvas->setMatrix(SkMatrix::Scale(3, 3));
            canvas->clipRect(SkRect::MakeLTRB(0, 0, 400, 400));
            switch (fState) {
                case kZoomIn:
                    fDelta += 0.2f;
                    canvas->scale(fDelta, fDelta);
                    break;
                case kScroll:
                    if (fAnimationLoop > kAnimationIterations/2) {
                        fDelta += 80.f;
                    } else {
                        fDelta -= 80.f;
                    }
                    canvas->scale(fDelta, fDelta);
                    canvas->translate(fDelta, 0);
                    break;
                case kZoomOut:
                    fDelta += 0.2f;
                    canvas->scale(fDelta, fDelta);
                    break;
            }

            fDom->render(canvas);
        }
    }

    void resize(SkScalar w, SkScalar h) override {
        if (fDom) {
            fDom->setContainerSize(SkSize::Make(w, h));
        }
    }

    bool animate(double nanos) override {
        if (!fDom) {
            return false;
        }

        --fAnimationLoop;
        if (fAnimationLoop == 0) {
            fAnimationLoop = kAnimationIterations;
            switch (fState) {
                case kZoomIn:
                    fState = kScroll;
                    fDelta = 0;
                    break;
                case kScroll:
                    fState = kZoomOut;
                    fDelta = 2;
                    break;
                case kZoomOut:
                    fState = kZoomIn;
                    fDelta = 1;
                    break;
            }
        }
        return true;
    }
};
} // namespace

DEF_SLIDE( return new AnimatedSVGSlide("Cowboy.svg", "SampleCowboy"); )

#endif  // defined(SK_ENABLE_SVG)
