package com.cv.tnn.model;

import android.graphics.Color;
import android.graphics.RectF;

import java.util.Random;
import java.util.Vector;

public class FrameInfo {

    public float xmin, ymin, xmax, ymax;
    public int label;
    public float score;
    public Vector<KeyPoint> keypoints = new Vector<KeyPoint>();
    public static final Integer[][] color_table = {{0, 0, 255}, {0, 255, 0}, {255, 0, 0}, {128, 0, 0}, {0, 128, 0}, {128, 128, 0}, {0, 0, 128}, {128, 0, 128}, {0, 128, 128}, {128, 128, 128}};
    private static final String[] class_name = {"undrowsy", "drowsy"};

    /***
     * 添加检测框
     * @param x 检测框左上角x
     * @param y 检测框左上角y
     * @param w 检测框宽度width
     * @param h 检测框高度height
     * @param label 检测框的ID(label)
     * @param score 检测框的分数
     */
    public void addBox(float x, float y, float w, float h, int label, float score) {
        this.xmin = x;
        this.ymin = y;
        this.xmax = x + w;
        this.ymax = y + h;
        this.label = label;
        this.score = score;
        //String box_info = String.format("box:[%f,%f,%f，%f] label:%d,score:%f \n", xmin, ymin, xmax, ymax, label, score);
        //Log.w(TAG, box_info);
    }

    /***
     * 添加关键点坐标
     * @param x 关键点坐标x
     * @param y 关键点坐标y
     * @param score 关键点分数
     */
    public void addKeyPoint(float x, float y, float score) {
        //String info = String.format("point:[%f,%f] score:%f \n", x, y, score);
        //Log.w(TAG, info);
        KeyPoint kp = new KeyPoint(x, y, score);
        this.keypoints.add(kp);
    }

    /***
     * 获得关键点
     * @return
     */
    public Vector<KeyPoint> getKeyPoints() {
        return keypoints;
    }

    /***
     * 获得检测框
     * @return
     */
    public RectF getRect() {
        return new RectF(xmin, ymin, xmax, ymax);
    }

    /***
     * 获得label名称
     * @return
     */
    public String getClassName() {
        return class_name[label];
    }

    /***
     * 获得label ID
     * @return
     */
    public int getLabel() {
        return this.label;
    }

    /***
     * 获得检测框的分数
     * @return
     */
    public float getScore() {
        return score;
    }

    /***
     * 获得检测框的颜色，用于绘制图像
     * @return
     */
    public int getColor() {
        return Color.argb(255, color_table[label][0], color_table[label][1], color_table[label][2]);
    }

    public int getRandomColor() {
        Random random = new Random(label);
        return Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256));
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("FrameInfo{");
        sb.append("xmin=").append(xmin);
        sb.append(", ymin=").append(ymin);
        sb.append(", xmax=").append(xmax);
        sb.append(", ymax=").append(ymax);
        sb.append(", label=").append(label).append(" (").append(getClassName()).append(")");
        sb.append(", score=").append(score);
        sb.append(", keypoints={");
        for (KeyPoint kp : keypoints) {
            sb.append(kp).append(", ");
        }
        if (!keypoints.isEmpty()) {
            sb.setLength(sb.length() - 2); // 移除最后的逗号和空格
        }
        sb.append("}");
        sb.append(", color=").append(String.format("#%06X", 0xFFFFFF & getColor()));
        sb.append("}");
        return sb.toString();
    }
}

