package com.example.studentfaceregistry.face

import android.graphics.Bitmap
import android.graphics.Matrix
import kotlin.math.absoluteValue
import kotlin.math.cos
import kotlin.math.sin
import kotlin.math.sqrt

/**
 * 人脸对齐器
 * 通过人脸关键点（左右眼）进行旋转对齐，提升识别准确率
 */
class FaceAligner {

    /**
     * 根据左右眼位置对齐人脸
     * @param bitmap 原始人脸图片（已裁剪）
     * @param leftEyeX 左眼 X 坐标（相对于原始图片）
     * @param leftEyeY 左眼 Y 坐标（相对于原始图片）
     * @param rightEyeX 右眼 X 坐标（相对于原始图片）
     * @param rightEyeY 右眼 Y 坐标（相对于原始图片）
     * @param faceLeft 人脸矩形左边（相对于原始图片）
     * @param faceTop 人脸矩形上边（相对于原始图片）
     * @return 对齐后的人脸图片
     */
    fun align(
        bitmap: Bitmap,
        leftEyeX: Float,
        leftEyeY: Float,
        rightEyeX: Float,
        rightEyeY: Float,
        faceLeft: Int,
        faceTop: Int
    ): Bitmap {
        // 计算眼睛在裁剪后图片中的相对位置
        val leftEyeRelX = leftEyeX - faceLeft
        val leftEyeRelY = leftEyeY - faceTop
        val rightEyeRelX = rightEyeX - faceLeft
        val rightEyeRelY = rightEyeY - faceTop

        // 计算两眼连线的旋转角度（目标是让连线水平）
        val angle = calculateRotationAngle(leftEyeRelX, leftEyeRelY, rightEyeRelX, rightEyeRelY)

        // 如果角度很小（小于 2 度），直接返回原图
        if (angle.absoluteValue < 2f) {
            return bitmap
        }

        // 计算旋转中心（两眼中心点）
        val centerX = bitmap.width / 2f
        val centerY = bitmap.height / 2f

        // 创建旋转矩阵
        val matrix = Matrix()
        matrix.postRotate(-angle, centerX, centerY)

        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
    }

    /**
     * 计算两眼连线的旋转角度
     */
    private fun calculateRotationAngle(x1: Float, y1: Float, x2: Float, y2: Float): Float {
        val dx = x2 - x1
        val dy = y2 - y1
        return Math.atan2(dy.toDouble(), dx.toDouble()).toFloat() * 180f / Math.PI.toFloat()
    }

    /**
     * 简单版本：仅根据估计的眼睛位置进行对齐
     * 适用于没有启用关键点检测的场景
     */
    fun alignWithEstimation(bitmap: Bitmap, faceLeft: Int, faceTop: Int, headAngle: Float? = null): Bitmap {
        // 估计眼睛位置（基于人脸矩形的经验比例）
        val faceWidth = bitmap.width
        val faceHeight = bitmap.height

        // 眼睛通常位于人脸上部约 35-40% 的位置
        val eyeY = faceHeight * 0.38f

        // 左右眼大约在人脸宽度的 35% 和 65% 位置
        val leftEyeX = faceWidth * 0.35f
        val rightEyeX = faceWidth * 0.65f

        // 如果有头部角度信息，使用它来调整
        return if (headAngle != null && headAngle.absoluteValue > 2f) {
            val centerX = faceWidth / 2f
            val centerY = faceHeight / 2f
            val matrix = Matrix()
            matrix.postRotate(-headAngle, centerX, centerY)
            Bitmap.createBitmap(bitmap, 0, 0, faceWidth, faceHeight, matrix, true)
        } else {
            align(bitmap, leftEyeX, eyeY, rightEyeX, eyeY, faceLeft, faceTop)
        }
    }
}
