/*
 * 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.myfaces.html5.renderkit.animation;

import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
import org.apache.myfaces.html5.component.animation.AbstractAnimationScale;
import org.apache.myfaces.html5.component.animation.AbstractBaseAnimation;
import org.apache.myfaces.html5.renderkit.util.RendererUtils;

import javax.faces.context.FacesContext;
import java.text.NumberFormat;
import java.util.Locale;

@JSFRenderer(renderKitId = "HTML_BASIC", family = "org.apache.myfaces.AnimationScale", type = "org.apache.myfaces.html5.AnimationScale")
public class AnimationScaleRenderer extends BaseAnimationRenderer {

    @Override
    protected String getKeyFrameBodyDefinition(FacesContext facesContext, AbstractBaseAnimation uiComponent) {
        RendererUtils.checkParamValidity(facesContext, uiComponent, AbstractAnimationScale.class);

        AbstractAnimationScale component = (AbstractAnimationScale) uiComponent;

        final double minSize = component.getMinSize();        //default value set, if not defined
        final double maxSize = component.getMaxSize();        //default value set, if not defined

        String format = "0%% {-webkit-transform: scale(%s);} 50%% {-webkit-transform: scale(%s);} 100%% {-webkit-transform: scale(%s);}";

        final NumberFormat numberFormat = NumberFormat.getInstance(Locale.ENGLISH);

        final String strMaxSize = numberFormat.format(maxSize);
        final String strMinSize = numberFormat.format(minSize);

        return String.format(format, strMaxSize, strMinSize, strMaxSize);
    }
}