package org.researchstack.backbone.ui.graph;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.support.annotation.StringRes;
import android.support.v7.widget.CardView;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.data.PieData;

import org.researchstack.backbone.R;

import java.text.NumberFormat;

public class PieChartCard extends CardView {
    private TextView titleTextView;
    private PieChart chart;
    private LinearLayout rowContainer;

    private NumberFormat numberFormat;

    private int valueTextFormat;
    private String titleText;
    private int titleTextColor;
    private float titleTextSize;
    private String titleTextTypeface;

    public PieChartCard(Context context) {
        super(context);
        initializeRoot(null, R.attr.pieChartCardStyle);
        initializeViews();
    }

    public PieChartCard(Context context, AttributeSet attrs) {
        super(context, attrs);
        initializeRoot(attrs, R.attr.pieChartCardStyle);
        initializeViews();
    }

    public PieChartCard(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initializeRoot(attrs, defStyleAttr);
        initializeViews();
    }

    private void initializeRoot(AttributeSet attrs, int defStyleAttr) {
        LayoutInflater.from(getContext()).inflate(R.layout.rsb_view_chart_pie, this, true);

        numberFormat = NumberFormat.getInstance();
        numberFormat.setMinimumFractionDigits(0);
        numberFormat.setMaximumFractionDigits(2);

        final TypedArray a = getContext().obtainStyledAttributes(attrs,
                R.styleable.PieChartCard,
                defStyleAttr,
                R.style.Widget_Backbone_Chart_Pie);

        titleText = a.getString(R.styleable.PieChartCard_titleText);
        titleTextColor = a.getColor(R.styleable.PieChartCard_titleTextColor, 0);
        titleTextSize = a.getDimension(R.styleable.PieChartCard_titleTextSize, 0);
        titleTextTypeface = a.getString(R.styleable.PieChartCard_titleTextTypeface);
        valueTextFormat = a.getResourceId(R.styleable.PieChartCard_valueTextFormat, 0);

        a.recycle();
    }

    private void initializeViews() {
        titleTextView = (TextView) findViewById(R.id.view_chart_pie_title);
        titleTextView.setText(titleText);
        titleTextView.setTextColor(titleTextColor);
        titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleTextSize);
        titleTextView.setTypeface(Typeface.create(titleTextTypeface, Typeface.NORMAL));

        chart = (PieChart) findViewById(R.id.view_chart_pie);
        chart.setDrawSliceText(false);
        chart.setTouchEnabled(false);
        chart.setHoleRadius(0);
        chart.setTransparentCircleRadius(0);
        chart.getLegend().setEnabled(false);
        chart.setDescription("");
        chart.setDrawCenterText(false);

        rowContainer = (LinearLayout) findViewById(R.id.view_chart_pie_rows);
    }

    public void setTitle(@StringRes int titleResId) {
        String title = getContext().getString(titleResId);
        setTitle(title);
    }

    public void setTitle(String title) {
        titleTextView.setText(title);
    }

    public void setData(PieData data) {
        chart.setData(data);
        chart.notifyDataSetChanged();
        chart.invalidate();

        rowContainer.removeAllViews();
        LayoutInflater inflater = LayoutInflater.from(getContext());

        for (int i = 0, size = data.getXVals().size(); i < size; i++) {
            String xVal = data.getXVals().get(i);
            float entryValue = data.getDataSet().getEntryForIndex(i).getVal();

            View row = inflater.inflate(R.layout.rsb_item_chart_pie, rowContainer, false);

            TextView label = (TextView) row.findViewById(R.id.item_chart_pie_label);
            label.setText(xVal);
            label.setTextColor(data.getDataSet().getColor(i));

            TextView value = (TextView) row.findViewById(R.id.item_chart_pie_value);
            value.setText(getContext().getString(valueTextFormat, numberFormat.format(entryValue)));
            value.setTextColor(data.getDataSet().getColor(i));

            rowContainer.addView(row);
        }
    }

    public PieChart getChart() {
        return chart;
    }
}