package com.github.reactNativeMPAndroidChart.charts;

import android.graphics.Color;
import android.view.View;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.ChartData;
import com.github.mikephil.charting.interfaces.datasets.IDataSet;
import com.github.reactNativeMPAndroidChart.utils.BridgeUtils;
import com.github.reactNativeMPAndroidChart.utils.ChartDataSetConfigUtils;

import java.util.ArrayList;

public class BarChartManager extends BarLineChartBaseManager<BarChart, BarEntry> {

    @Override
    public String getName() {
        return "MPAndroidBarChart";
    }

    @Override
    protected View createViewInstance(ThemedReactContext reactContext) {
        BarChart barChart = new BarChart(reactContext);

        return barChart;
    }

    @Override
    ChartData createData(String[] xValues) {
        return new BarData(xValues);
    }

    @Override
    IDataSet createDataSet(ArrayList<BarEntry> entries, String label) {
        return new BarDataSet(entries, label);
    }

    @Override
    BarEntry createEntry(ReadableArray yValues, int index) {
        BarEntry entry;

        if (ReadableType.Array.equals(yValues.getType(index))) {
            entry = new BarEntry(BridgeUtils.convertToFloatArray(yValues.getArray(index)), index);
        } else if (ReadableType.Number.equals(yValues.getType(index))) {
            entry = new BarEntry((float) yValues.getDouble(index), index);
        } else {
            throw new IllegalArgumentException("Unexpected entry type: " + yValues.getType(index));
        }

        return entry;
    }

    @Override
    void dataSetConfig(IDataSet<BarEntry> dataSet, ReadableMap config) {
        BarDataSet barDataSet = (BarDataSet) dataSet;

        ChartDataSetConfigUtils.commonConfig(barDataSet, config);
        ChartDataSetConfigUtils.commonBarLineScatterCandleBubbleConfig(barDataSet, config);

        if (BridgeUtils.validate(config, ReadableType.Number, "barSpacePercent")) {
            barDataSet.setBarSpacePercent((float) config.getDouble("barSpacePercent"));
        }
        if (BridgeUtils.validate(config, ReadableType.String, "barShadowColor")) {
            barDataSet.setBarShadowColor(Color.parseColor(config.getString("barShadowColor")));
        }
        if (BridgeUtils.validate(config, ReadableType.Number, "highlightAlpha")) {
            barDataSet.setHighLightAlpha(config.getInt("highlightAlpha"));
        }
        if (BridgeUtils.validate(config, ReadableType.Array, "stackLabels")) {
            barDataSet.setStackLabels(BridgeUtils.convertToStringArray(config.getArray("stackLabels")));
        }
    }

    @ReactProp(name = "drawValueAboveBar")
    public void setDrawValueAboveBar(BarChart chart, boolean enabled) {
        chart.setDrawValueAboveBar(enabled);
    }

    @ReactProp(name = "drawBarShadow")
    public void setDrawBarShadow(BarChart chart, boolean enabled) {
        chart.setDrawBarShadow(enabled);
    }

    @ReactProp(name = "drawHighlightArrow")
    public void setDrawHighlightArrow(BarChart chart, boolean enabled) {
        chart.setDrawHighlightArrow(enabled);
    }
}