package com.numetriclabz.numandroidcharts;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

import java.util.List;
import java.util.Random;

public class MultiLevelPie extends View{

    List<ChartData> data;
    Paint piePaint;
    RectF mRectF  = new RectF();
    int width;
    int height;
    float midX, midY, radius, innerRadius;


    public MultiLevelPie(Context context, AttributeSet attributeSet){
        super(context, attributeSet);

        init();
    }


    public void init(){

        piePaint = new Paint();

        piePaint.setAntiAlias(true);
        piePaint.setDither(true);
        piePaint.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int minw = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth();

        width = Math.max(minw, MeasureSpec.getSize(widthMeasureSpec));
        height = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(width, height);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawColor(Color.TRANSPARENT);
        piePaint.reset();
        piePaint.setAntiAlias(true);



        midX = getWidth() / 2;
        midY = getHeight() / 2;

        if (midX < midY) {
            radius = midX;
        } else {
            radius = midY;
        }

        innerRadius = radius / 2;

        for (int i = 0; i < this.data.size(); i++){

            Float[] val = this.data.get(i).getY_List();
            drawChart(val, canvas, radius/(i+1));
        }
    }

    private void drawChart(Float[] val, Canvas canvas, float radius){

        float innerRadius = radius/2;

        float currentAngle = 270;
        float currentSweep = 0;

        float totalValue = 0;

        for(int i = 0; i < val.length; i++) {
            totalValue += val[i];
        }

        for(int i = 0; i < val.length; i++) {

            Path p = new Path();
            p.reset();

            Random rnd = new Random();
            int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));

            piePaint.setColor(color);

            currentSweep = (val[i]/ totalValue) * (360);

            mRectF.set(midX - radius, midY - radius, midX + radius, midY + radius);
            createArc(p, mRectF, currentSweep, currentAngle, currentSweep);
            mRectF.set(midX - innerRadius, midY - innerRadius, midX + innerRadius, midY + innerRadius);
            createArc(p, mRectF, currentSweep, currentAngle + currentSweep, -currentSweep);

            p.close();

            canvas.drawPath(p, piePaint);
            currentAngle = currentAngle + currentSweep;
        }
    }


    private void createArc(Path p, RectF mRectF, float currentSweep, float startAngle, float sweepAngle) {
        if (currentSweep == 360) {
            p.addArc(mRectF, startAngle, sweepAngle);
        } else {
            p.arcTo(mRectF, startAngle, sweepAngle);
        }
    }

    public void setData(List<ChartData> data){

        this.data = data;
        invalidate();
    }
}