/*******************************************************************************
 * Copyright 2012-present Pixate, Inc.
 * 
 * Licensed 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 com.pixate.freestyle.styling.stylers;

import java.util.HashMap;
import java.util.Map;

import android.view.View;
import android.widget.ListView;

import com.pixate.freestyle.annotations.PXDocProperty;
import com.pixate.freestyle.annotations.PXDocStyler;
import com.pixate.freestyle.styling.PXDeclaration;
import com.pixate.freestyle.styling.adapters.PXStyleAdapter;
import com.pixate.freestyle.util.PXDrawableUtil;

//@formatter:off
/**
 * - divider: <paint>
 * - divider-height: <length>
 */
//@formatter:on
@PXDocStyler(properties = { @PXDocProperty(name = "divider", syntax = "<paint>"),
        @PXDocProperty(name = "divider-height", syntax = "<length>"), })
public class PXDividerStyler extends PXStylerBase {

    private static PXDividerStyler instance;
    private static Map<String, PXDeclarationHandler> handlers;

    public static PXDividerStyler getInstance() {
        if (instance == null) {
            instance = new PXDividerStyler(null);
        }
        return instance;
    }

    public PXDividerStyler(PXStylerInvocation invocation) {
        super(invocation);
    }

    @Override
    public Map<String, PXDeclarationHandler> getDeclarationHandlers() {
        if (handlers == null) {
            handlers = new HashMap<String, PXStylerBase.PXDeclarationHandler>();

            handlers.put("divider", new PXDeclarationHandler() {
                public void process(PXDeclaration declaration, PXStylerContext stylerContext) {
                    stylerContext.setDividerFill(declaration.getPaintValue());
                }
            });

            handlers.put("divider-height", new PXDeclarationHandler() {
                public void process(PXDeclaration declaration, PXStylerContext stylerContext) {
                    float height = declaration.getFloatValue(stylerContext.getDisplayMetrics());
                    ListView listView = (ListView) stylerContext.getStyleable();
                    listView.setDividerHeight((int) height);
                }

            });
        }
        return handlers;
    }

    /*
     * Apply styles after everything is loaded to the context. We'll need to get
     * the accurate divider height when creating the drawable.
     * @see
     * com.pixate.freestyle.styling.stylers.PXStylerBase#applyStylesWithContext
     * (com.pixate.freestyle.styling.stylers.PXStylerContext)
     */
    @Override
    public void applyStylesWithContext(PXStylerContext stylerContext) {
        ListView listView = (ListView) stylerContext.getStyleable();
        // create the divider drawable and set it to the list
        int width = listView.getWidth();
        if (width <= 0) {
            View parent = (View) PXStyleAdapter.getStyleAdapter(listView).getParent(listView);
            if (parent != null) {
                width = parent.getWidth();
            }
        }
        listView.setDivider(PXDrawableUtil.createDrawable(width, listView.getDividerHeight(),
                stylerContext.getDividerFill()));
    }
}