package com.auto.clicker.autoclicker.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;

import com.auto.clicker.autoclicker.R;

public class ConnectingLineView extends View {

    // 画笔，用于绘制连接带。设置为填充样式。
    private final Paint connectionBandPaint;

    // 连接带的宽度，单位 dp。
    private final float CONNECTION_BAND_WIDTH_DP = 30f;
    // 连接带在屏幕上的实际像素宽度。
    private float connectionBandWidthPx;

    // 绘制时，连接带的逻辑起始点和结束点（在 View 自身的坐标系中）。
    private float drawStartX, drawStartY, drawEndX, drawEndY;
    // 连接带的长度。
    private float lineLength;
    // 连接带的旋转角度（以度为单位）。
    private float rotationAngle;

    // 用于表示方向的 Drawable 图标。
    private Drawable startArrowDrawable;
    private Drawable endArrowDrawable;

    public ConnectingLineView(Context context) {
        super(context);
        // 将 dp 单位的宽度转换为像素单位，以便在 Canvas 上绘制。
        connectionBandWidthPx = dpToPx(context, CONNECTION_BAND_WIDTH_DP);

        connectionBandPaint = new Paint();

        connectionBandPaint.setColor(Color.parseColor("#80184857"));
        connectionBandPaint.setAntiAlias(true);
        connectionBandPaint.setStyle(Paint.Style.FILL);

        startArrowDrawable = ContextCompat.getDrawable(context, R.drawable.white_arrow_right);
        endArrowDrawable = ContextCompat.getDrawable(context, R.drawable.white_arrow_right);

    }

    private float dpToPx(Context context, float dp) {
        return dp * context.getResources().getDisplayMetrics().density;
    }


    public void setPoints(float startX, float startY, float endX, float endY) {
        // 计算两点间的X和Y坐标差。
        float deltaX = endX - startX;
        float deltaY = endY - startY;

        // 计算连接带的长度（两点间的直线距离）。
        this.lineLength = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY);

        // 计算连接带的旋转角度。
        // Math.atan2(y, x) 返回的是从X轴正向到点(x,y)的弧度，范围是-PI到PI。
        // Math.toDegrees 将弧度转换为度数。
        this.rotationAngle = (float) Math.toDegrees(Math.atan2(deltaY, deltaX));

        this.drawStartX = startX;
        this.drawStartY = startY;
        this.drawEndX = endX;
        this.drawEndY = endY;

        invalidate();
    }

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

        if (lineLength == 0) {
            return;
        }

        // 保存当前画布的状态。
        // 这允许我们对画布进行平移和旋转操作，而不会影响后续或外部的绘制。
        canvas.save();

        // 1. 平移画布到连接带的起始点。
        // 这样，在绘制时，连接带的逻辑起始点就变成了 (0,0)。
        canvas.translate(drawStartX, drawStartY);

        // 2. 旋转画布。
        // 围绕当前的画布原点（即连接带的起始点）旋转画布。
        // 之后绘制的所有内容都会以这个角度显示。
        canvas.rotate(rotationAngle);

        // 3. 绘制连接带的矩形。
        // RectF 定义了一个矩形。由于画布已经旋转和平移，
        // 这里的 (0, -connectionBandWidthPx / 2) 是矩形的左上角，
        // (lineLength, connectionBandWidthPx / 2) 是矩形的右下角。
        // 这样矩形就会以当前 Y 轴为中心，从当前 X 轴原点（0）延伸到 lineLength。
        RectF rect = new RectF(0, -connectionBandWidthPx / 2, lineLength, connectionBandWidthPx / 2);
        canvas.drawRect(rect, connectionBandPaint);

        // 4. 绘制起始方向图标。
        if (startArrowDrawable != null) {
            int arrowSize = (int) (connectionBandWidthPx / 2);
            // 设置图标的边界。这里的坐标是相对于当前已旋转和平移的画布。
            // 确保图标垂直居中于连接带。
            startArrowDrawable.setBounds(
                    75,
                    (int) (-arrowSize / 2),// 垂直居中
                    75 + arrowSize,
                    (int) (arrowSize / 2)
            );
            startArrowDrawable.draw(canvas);
        }

        if (endArrowDrawable != null) {
            int arrowSize = (int) (connectionBandWidthPx / 2);
            endArrowDrawable.setBounds(
                    (int) (lineLength - arrowSize - 75),
                    (int) (-arrowSize / 2),
                    (int) (lineLength - 75),
                    (int) (arrowSize / 2)
            );
            endArrowDrawable.draw(canvas);
        }

        // 恢复画布到 save() 调用之前的状态。
        canvas.restore();
    }
}