package com.github.wuxudong.rncharts.data;

import android.graphics.Paint;

import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableType;
import com.github.mikephil.charting.data.CandleData;
import com.github.mikephil.charting.data.CandleDataSet;
import com.github.mikephil.charting.data.CandleEntry;
import com.github.mikephil.charting.interfaces.datasets.IDataSet;
import com.github.wuxudong.rncharts.utils.BridgeUtils;
import com.github.wuxudong.rncharts.utils.ChartDataSetConfigUtils;
import com.github.wuxudong.rncharts.utils.ConversionUtil;

import java.util.ArrayList;
import java.util.Locale;

/**
 * Created by xudong on 02/03/2017.
 */
public class CandleDataExtract extends DataExtract<CandleData, CandleEntry> {
    @Override
    CandleData createData() {
        return new CandleData();
    }

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

    @Override
    void dataSetConfig(IDataSet<CandleEntry> dataSet, ReadableMap config) {
        CandleDataSet candleDataSet = (CandleDataSet) dataSet;
        ChartDataSetConfigUtils.commonConfig(candleDataSet, config);
        ChartDataSetConfigUtils.commonBarLineScatterCandleBubbleConfig(candleDataSet, config);
        ChartDataSetConfigUtils.commonLineScatterCandleRadarConfig(candleDataSet, config);

        // CandleDataSet only config
        if (BridgeUtils.validate(config, ReadableType.Number, "barSpace")) {
            candleDataSet.setBarSpace((float) config.getDouble("barSpace"));
        }
        if (BridgeUtils.validate(config, ReadableType.Number, "shadowWidth")) {
            candleDataSet.setShadowWidth((float) config.getDouble("shadowWidth"));
        }
        if (BridgeUtils.validate(config, ReadableType.Number, "shadowColor")) {
            candleDataSet.setShadowColor(config.getInt("shadowColor"));
        }
        if (BridgeUtils.validate(config, ReadableType.Boolean, "shadowColorSameAsCandle")) {
            candleDataSet.setShadowColorSameAsCandle(config.getBoolean("shadowColorSameAsCandle"));
        }
        if (BridgeUtils.validate(config, ReadableType.Number, "neutralColor")) {
            candleDataSet.setNeutralColor(config.getInt("neutralColor"));
        }
        if (BridgeUtils.validate(config, ReadableType.Number, "decreasingColor")) {
            candleDataSet.setDecreasingColor(config.getInt("decreasingColor"));
        }
        if (BridgeUtils.validate(config, ReadableType.String, "decreasingPaintStyle")) {
            candleDataSet.setDecreasingPaintStyle(Paint.Style.valueOf(config.getString("decreasingPaintStyle").toUpperCase(Locale.ENGLISH)));
        }
        if (BridgeUtils.validate(config, ReadableType.Number, "increasingColor")) {
            candleDataSet.setIncreasingColor(config.getInt("increasingColor"));
        }
        if (BridgeUtils.validate(config, ReadableType.String, "increasingPaintStyle")) {
            candleDataSet.setIncreasingPaintStyle(Paint.Style.valueOf(config.getString("increasingPaintStyle").toUpperCase(Locale.ENGLISH)));
        }
    }

    @Override
    CandleEntry createEntry(ReadableArray values, int index) {
        if (!ReadableType.Map.equals(values.getType(index))) {
            throw new IllegalArgumentException();
        }

        ReadableMap map = values.getMap(index);

        float x = index;
        if (map.hasKey("x")) {
            x = (float) map.getDouble("x");
        }

        if (
                !BridgeUtils.validate(map, ReadableType.Number, "shadowH") ||
                        !BridgeUtils.validate(map, ReadableType.Number, "shadowL") ||
                        !BridgeUtils.validate(map, ReadableType.Number, "open") ||
                        !BridgeUtils.validate(map, ReadableType.Number, "close")) {
            throw new IllegalArgumentException("CandleStick data must contain: shadowH, shadowL, open and close values");
        }

        float shadowH = (float) map.getDouble("shadowH");
        float shadowL = (float) map.getDouble("shadowL");
        float open = (float) map.getDouble("open");
        float close = (float) map.getDouble("close");

        CandleEntry candleEntry = new CandleEntry(x, shadowH, shadowL, open, close, ConversionUtil.toMap(map));

        return candleEntry;
    }
}
