package com.rncollapsingtoolbar;

import android.graphics.Color;
import android.graphics.Typeface;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.View;

import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.views.text.ReactFontManager;

public class CollapsingToolbarLayoutManager extends ViewGroupManager<CollapsingToolbarLayoutView> {

    private final static String REACT_CLASS = "CTLCollapsingToolbarLayout";

    private int height = 56;

    @Override
    public String getName() {
        return REACT_CLASS;
    }

    @Override
    public CollapsingToolbarLayoutView createViewInstance(ThemedReactContext context) {
        return new CollapsingToolbarLayoutView(context);
    }

    @ReactProp(name = "title")
    public void setTitle(CollapsingToolbarLayoutView view, String title) {
        view.setTitle(title);
    }

    @ReactProp(name = "titleEnable")
    public void setTitleEnable(CollapsingToolbarLayoutView view, boolean enable) {
        view.setTitleEnabled(enable);
    }

    @ReactProp(name = "height", defaultInt = 56)
    public void setToolbarHeight(CollapsingToolbarLayoutView view, int height) {
        height = height;
    }

    @ReactProp(name = "contentScrimColor")
    public void setContentScrimColor(CollapsingToolbarLayoutView view, String color) {
        view.setContentScrimColor(Color.parseColor(color));
    }

    @ReactProp(name = "statusBarScrimColor")
    public void setStatusBarScrimColor(CollapsingToolbarLayoutView view, String color) {
        view.setStatusBarScrimColor(Color.parseColor(color));
    }

    @ReactProp(name = "scrimVisibleHeightTrigger")
    public void setScrimVisibleHeightTrigger(CollapsingToolbarLayoutView view, int height) {
        view.setScrimVisibleHeightTrigger((int) PixelUtil.toPixelFromDIP(height));
    }

    @ReactProp(name = "scrimAnimationDuration")
    public void setScrimAnimationDuration(CollapsingToolbarLayoutView view, int duration) {
        view.setScrimAnimationDuration(duration);
    }

    @ReactProp(name = "collapsedTitleTextColor")
    public void setCollapsedTitleTextColor(CollapsingToolbarLayoutView view, String color) {
        view.setCollapsedTitleTextColor(Color.parseColor(color));
    }

    @ReactProp(name = "collapsedTitleGravity")
    public void setCollapsedTitleGravity(CollapsingToolbarLayoutView view, String gravity) {
        view.setCollapsedTitleGravity(getGravity(gravity));
    }

    @ReactProp(name = "collapsedTitleTypeface")
    public void setCollapsedTitleTypeface(CollapsingToolbarLayoutView view, String font) {
        try {
            Typeface face = ReactFontManager.getInstance().getTypeface(font, Typeface.NORMAL, view.getContext().getAssets());
            view.setCollapsedTitleTypeface(face);
        } catch (Exception e) {
        }
    }

    @ReactProp(name = "expandedTitleColor")
    public void setExpandedTitleColor(CollapsingToolbarLayoutView view, String color) {
        view.setExpandedTitleColor(Color.parseColor(color));
    }

    @ReactProp(name = "expandedTitleGravity")
    public void setExpandedTitleGravity(CollapsingToolbarLayoutView view, String gravity) {
        view.setExpandedTitleGravity(getGravity(gravity));
    }

    @ReactProp(name = "expandedTitleTypeface")
    public void setExpandedTitleTypeface(CollapsingToolbarLayoutView view, String font) {
        try {
            Typeface face = ReactFontManager.getInstance().getTypeface(font, Typeface.NORMAL, view.getContext().getAssets());
            view.setExpandedTitleTypeface(face);
        } catch (Exception e) {
        }
    }

    @ReactProp(name = "expandedTitleMargin")
    public void setExpandedTitleMargin(CollapsingToolbarLayoutView view, ReadableMap margin) {
        int start = margin.getInt("start");
        int top = margin.getInt("top");
        int end = margin.getInt("end");
        int bottom = margin.getInt("bottom");
        view.setExpandedTitleMargin(
            (int) PixelUtil.toPixelFromDIP(start),
            (int) PixelUtil.toPixelFromDIP(top),
            (int) PixelUtil.toPixelFromDIP(end),
            (int) PixelUtil.toPixelFromDIP(bottom)
        );
    }

    @ReactProp(name = "expandedTitleMarginStart")
    public void setExpandedTitleMarginStart(CollapsingToolbarLayoutView view, int margin) {
        view.setExpandedTitleMarginStart((int) PixelUtil.toPixelFromDIP(margin));
    }

    @ReactProp(name = "expandedTitleMarginTop")
    public void setExpandedTitleMarginTop(CollapsingToolbarLayoutView view, int margin) {
        view.setExpandedTitleMarginTop((int) PixelUtil.toPixelFromDIP(margin));
    }

    @ReactProp(name = "expandedTitleMarginEnd")
    public void setExpandedTitleMarginEnd(CollapsingToolbarLayoutView view, int margin) {
        view.setExpandedTitleMarginEnd((int) PixelUtil.toPixelFromDIP(margin));
    }

    @ReactProp(name = "expandedTitleMarginBottom")
    public void setExpandedTitleMarginBottom(CollapsingToolbarLayoutView view, int margin) {
        view.setExpandedTitleMarginBottom((int) PixelUtil.toPixelFromDIP(margin));
    }

    @ReactProp(name = "scrollFlags")
    public void setExpandedTitleGravity(CollapsingToolbarLayoutView view, int flags) {
        AppBarLayout.LayoutParams params = new AppBarLayout.LayoutParams(
            AppBarLayout.LayoutParams.MATCH_PARENT,
            AppBarLayout.LayoutParams.MATCH_PARENT
        );

        params.setScrollFlags(flags);
        view.setLayoutParams(params);
    }

    private int getGravity(String gravity) {
        switch (gravity) {
            case "CENTER":
                return Gravity.CENTER;
            case "CENTER_VERTICAL":
                return Gravity.CENTER_VERTICAL;
            case "TOP":
                return Gravity.TOP;
            case "LEFT":
                return Gravity.LEFT;
            case "RIGHT":
                return Gravity.RIGHT;
            case "BOTTOM":
                return Gravity.BOTTOM;
            case "START":
                return Gravity.START;
            case "END":
                return Gravity.END;
            default:
                return Gravity.CENTER_VERTICAL;
        }
    }

    @Override
    public boolean needsCustomLayoutForChildren() {
        return true;
    }

    @Override
    public void addView(CollapsingToolbarLayoutView parent, View child, int index) {
        super.addView(parent, child, index);
        if (child instanceof Toolbar) {
            Toolbar toolbar = (Toolbar) child;
            int toolbarHeight = (int) PixelUtil.toPixelFromDIP(height);
            CollapsingToolbarLayout.LayoutParams params = new CollapsingToolbarLayout.LayoutParams(
                CollapsingToolbarLayout.LayoutParams.MATCH_PARENT,
                toolbarHeight
            );
            params.setCollapseMode(CollapsingToolbarLayout.LayoutParams.COLLAPSE_MODE_PIN);
            toolbar.setLayoutParams(params);
            toolbar.requestLayout();
        }
    }
}