/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.jackrabbit.oak.upgrade;

import java.util.Iterator;

import com.google.common.collect.Iterators;

public class AsciiArtTicker implements ProgressTicker {
    @Override
    public String tick() {
        return ticks.next();
    }

    private final String[] message = new String[] {

            " __        __",
            " \\ \\      / /",
            "  \\ \\ /\\ / / ",
            "   \\ V  V /  ",
            "    \\_/\\_/   ",
            "             ",
            "  _____ ",
            " | ____|",
            " |  _|  ",
            " | |___ ",
            " |_____|",
            "        ",
            "  _     ",
            " | |    ",
            " | |    ",
            " | |___ ",
            " |_____|",
            "        ",
            "   ____ ",
            "  / ___|",
            " | |    ",
            " | |___ ",
            "  \\____|",
            "        ",
            "   ___  ",
            "  / _ \\ ",
            " | | | |",
            " | |_| |",
            "  \\___/ ",
            "        ",
            "  __  __ ",
            " |  \\/  |",
            " | |\\/| |",
            " | |  | |",
            " |_|  |_|",
            "         ",
            "  _____ ",
            " | ____|",
            " |  _|  ",
            " | |___ ",
            " |_____|",
            "        ",
            "  _____ ",
            " |_   _|",
            "   | |  ",
            "   | |  ",
            "   |_|  ",
            "        ",
            "   ___  ",
            "  / _ \\ ",
            " | | | |",
            " | |_| |",
            "  \\___/ ",
            "        ",
            "   ___  ",
            "  / _ \\ ",
            " | | | |",
            " | |_| |",
            "  \\___/ ",
            "        ",
            "     _    ",
            "    / \\   ",
            "   / _ \\  ",
            "  / ___ \\ ",
            " /_/   \\_\\",
            "          ",
            "  _  __",
            " | |/ /",
            " | ' / ",
            " | . \\ ",
            " |_|\\_\\",
            "             ",
            " =========== ",
            "             ",
    };

    private final Iterator<String> ticks = Iterators.cycle(message);
}
