package com.lijunyan.blackmusic.view;

import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.graphics.drawable.Drawable;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import com.lijunyan.blackmusic.R;

/**
 * Created by lijunyan on 2017/3/7.
 */

public class ScanView extends View {

    private static final String TAG = "ScanView";

    /**
     * 画圆的笔
     */
    private Paint circlePaint;

    /**
     * 画扇形渲染的笔
     */
    private Paint sectorPaint;

    /**
     * 扫描线程
     */
    private ScanThread mThread;

    /**
     * 线程进行标志
     */
    private boolean threadFlag = false;

    /**
     * 线程启动标志
     */
    private boolean start = false;

    /**
     * 扇形转动的角度
     */
    private int angle = 0;

    /**
     * 当前视图的宽高,这里相同
     */
    private int viewSize;

    /**
     * 画在view中间的图片
     */
    private Bitmap bitmap;

    /**
     * 对图形进行处理的矩阵类
     */
    private Matrix matrix;
    private int accentColor;
    private String circlrColor1; //第一圈圆环颜色
    private String circlrColor2; //第二圈圆环颜色
    private String circlrColor3; //第三圈圆环颜色
    private String color;

    public ScanView(Context context) {
        this(context, null);
    }

    public ScanView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.theme);
        if (typedArray != null) {
            accentColor = typedArray.getColor(R.styleable.theme_accent_color, getResources().getColor(R.color.colorPrimary));
            typedArray.recycle();
        }
        color = colorToHexString(Color.red(accentColor)) + colorToHexString(Color.green(accentColor)) +
                colorToHexString(Color.blue(accentColor));
        circlrColor1 = "#D0" + color;
        circlrColor2 = "#70" + color;
        circlrColor3 = "#30" + color;
        Log.d(TAG, "ScanView: accentColor = "+ accentColor);
        Log.d(TAG, "ScanView: color = "+ color);
        Log.d(TAG, "ScanView: circlrColor1 = "+ circlrColor1);
        initBitmap();
    }
    public static String colorToHexString(int color){
        String colorHex;
        Log.d(TAG, "colorToHexString: color = "+color);
        if (color < 16){
            colorHex = "0"+ Integer.toHexString(color);
        }else {
            colorHex = Integer.toHexString(color);
        }
        return colorHex;
    }

    /**
     * 此处设置viewSize固定值为500
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        viewSize = 500;
        setMeasuredDimension(viewSize, viewSize);
    }


    /**
     * 从资源中解码bitmap
     */
    private void initBitmap() {
        Drawable drawable = tintDrawable(getResources().getDrawable(R.drawable.music_note),ColorStateList.valueOf(accentColor));
        bitmap = drawableToBitamp(drawable);
    }

    private Bitmap drawableToBitamp(Drawable drawable)
    {
        int w = drawable.getIntrinsicWidth();
        int h = drawable.getIntrinsicHeight();
        Bitmap bitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, w, h);
        drawable.draw(canvas);
        return bitmap;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint mPaint = new Paint();
        mPaint.setAntiAlias(true);
        Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        Rect rectd = new Rect((viewSize / 10) * 4, (viewSize / 10) * 4, viewSize - (viewSize / 10) * 4, viewSize - (viewSize / 10) * 4);
        canvas.drawBitmap(bitmap, rect, rectd, mPaint);

        circlePaint = new Paint();
        circlePaint.setStyle(Paint.Style.STROKE);
        circlePaint.setAntiAlias(true);
        circlePaint.setStrokeWidth((viewSize / 10));

        circlePaint.setColor(Color.parseColor(circlrColor1));
        canvas.drawCircle(viewSize / 2, viewSize / 2, (viewSize / 10) * 2.5f, circlePaint);

        circlePaint.setColor(Color.parseColor(circlrColor2));
        canvas.drawCircle(viewSize / 2, viewSize / 2, (viewSize / 10) * 3.5f, circlePaint);

        circlePaint.setColor(Color.parseColor(circlrColor3));
        canvas.drawCircle(viewSize / 2, viewSize / 2, (viewSize / 10) * 4.5f, circlePaint);

        sectorPaint = new Paint();
        sectorPaint.setAntiAlias(true);
        sectorPaint.setStyle(Paint.Style.STROKE);
        sectorPaint.setStrokeWidth((viewSize / 10) * 3);
        Shader sectorShader = new SweepGradient(viewSize / 2, viewSize / 2,
                new int[]{Color.TRANSPARENT, Color.argb(0,Color.red(accentColor),Color.green(accentColor),Color.blue(accentColor)),
                        Color.argb(255,Color.red(accentColor),Color.green(accentColor),Color.blue(accentColor))},
                new float[]{0, 0.875f, 1f});
        sectorPaint.setShader(sectorShader);

        if (threadFlag) {
            canvas.concat(matrix);
            canvas.drawCircle(viewSize / 2, viewSize / 2, (viewSize / 10) * 3.5f, sectorPaint);
        }
    }


    public void start() {
        mThread = new ScanThread(this);
        mThread.start();
        threadFlag = true;
        start = true;
    }

    public void stop() {
        if (start) {
            threadFlag = false;
            start = false;
            invalidate();
        }
    }


    class ScanThread extends Thread {

        private ScanView view;

        public ScanThread(ScanView view) {
            this.view = view;
        }

        @Override
        public void run() {
            super.run();
            while (threadFlag) {
                if (start) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            angle = angle + 5;
                            if (angle == 360) {
                                angle = 0;
                            }
                            matrix = new Matrix();
                            matrix.setRotate(angle, viewSize / 2, viewSize / 2);
                            view.invalidate();
                        }
                    });
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public Drawable tintDrawable(Drawable drawable, ColorStateList colors) {
        Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
        DrawableCompat.setTintList(wrappedDrawable, colors);
        return wrappedDrawable;
    }

}