package com.offline.music.player.helper;

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

public class CircularProgressBar extends View {
    private Paint progressPaint;
    private Paint backgroundPaint;
    private float progress = 0;
    private float maxProgress = 100;

    private int fixedSize = 47; // 固定圆环的直径（dp）
    private int progressWidth = 3; // 固定进度条宽度（dp）

    private OnProgressChangeListener listener; // 自定义监听器

    public CircularProgressBar(Context context) {
        super(context);
        init();
    }

    public CircularProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CircularProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // 初始化用于绘制进度条的画笔
        progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        progressPaint.setStyle(Paint.Style.STROKE);
        progressPaint.setStrokeWidth(dpToPx(progressWidth)); // 设置进度条宽度（dp）
        progressPaint.setColor(Color.WHITE); // 设置进度条颜色为白色

        // 初始化用于绘制背景环的画笔
        backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        backgroundPaint.setStyle(Paint.Style.STROKE);
        backgroundPaint.setStrokeWidth(dpToPx(progressWidth));
        backgroundPaint.setColor(Color.GRAY); // 设置背景环颜色为灰色
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // Convert dp to pixels
        int diameterPx = dpToPx(fixedSize);
        int size = diameterPx + dpToPx(progressWidth) * 2;
        setMeasuredDimension(size, size);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 获取视图中心坐标
        float centerX = getWidth() / 2f;
        float centerY = getHeight() / 2f;

        // 固定圆环的半径
        float radius = (Math.min(getWidth(), getHeight()) - dpToPx(progressWidth)) / 2f;

        // 绘制背景环
        canvas.drawCircle(centerX, centerY, radius, backgroundPaint);

        // 计算进度条的起始角度和扫过的角度
        float startAngle = -90f; // 从顶部开始
        float sweepAngle = 360f * progress / maxProgress; // 根据进度计算扫过的角度
        // 绘制进度条
        canvas.drawArc(
                centerX - radius, // 左上角 X 坐标
                centerY - radius, // 左上角 Y 坐标
                centerX + radius, // 右下角 X 坐标
                centerY + radius, // 右下角 Y 坐标
                startAngle, // 起始角度
                sweepAngle, // 扫过的角度
                false, // 是否使用扇形
                progressPaint // 使用的画笔
        );
    }

    public void setProgress(float progress) {
        this.progress = Math.max(0, Math.min(progress, maxProgress)); // 限制进度值在 0 到 maxProgress 之间
        if (listener != null) {
            listener.onProgressChanged(this, (int) progress); // 通知监听器进度变化
        }
        invalidate(); // 请求重新绘制视图
    }

    public void setMaxProgress(float maxProgress) {
        this.maxProgress = maxProgress;
        this.progress = Math.max(0, Math.min(this.progress, maxProgress)); // 调整当前进度值以适应新的最大值
        invalidate(); // 请求重新绘制视图
    }

    // 添加设置监听器的方法
    public void setOnProgressChangeListener(OnProgressChangeListener listener) {
        this.listener = listener;
    }

    // 自定义进度变化监听器接口
    public interface OnProgressChangeListener {
        void onProgressChanged(CircularProgressBar progressBar, int progress);
    }

    // 将 dp 转换为 px
    private int dpToPx(int dp) {
        float density = getResources().getDisplayMetrics().density;
        return Math.round(dp * density); // 将 dp 值乘以屏幕密度转换为 px
    }
}
