package com.bassbooster.soundeffects.equalizer.view.activity.edgelighting.customview

import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
import android.content.Context
import android.graphics.*
import android.graphics.drawable.VectorDrawable
import android.util.AttributeSet
import android.util.Log
import android.view.View
import androidx.core.content.ContextCompat
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import com.bassbooster.equalizer.R

class ImageBorderView(context: Context, attrs: AttributeSet?) : View(context, attrs) {
    private val borderPaint = Paint()
    private val borderRect = RectF()

    private val borderWidth = 10f // Độ rộng của đường viền
    private val padding = 30f // Padding bên trong view
    private val cornerRadius = 80f // Bán kính của các góc
    private var dynamicWidth = width.toFloat() // Động width ban đầu

    private val startColor = ContextCompat.getColor(context, R.color.end)
    private val endColor = ContextCompat.getColor(context, R.color.start)
    private val center = ContextCompat.getColor(context, R.color.center)

    var currentColor = startColor // Màu sắc hiện tại của đường viền

    private val path = Path()
    private var resizedAndColoredBitmap: Bitmap? = null
    private var resizedBitmap: Bitmap? = null
    var colorAnimator : ValueAnimator? = null
    private fun changeBitmapColor(sourceBitmap: Bitmap, color: Int): Bitmap {
        val resultBitmap = sourceBitmap.copy(sourceBitmap.config, true)
        val paint = Paint()
        val filter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
        paint.colorFilter = filter

        val canvas = Canvas(resultBitmap)
        canvas.drawBitmap(resultBitmap, 0f, 0f, paint)

        return resultBitmap
    }

    fun changeColor(end:Int){
        colorAnimator?.cancel()
        colorAnimator=null
        colorAnimator = ValueAnimator.ofObject(
            ArgbEvaluator(),
            startColor,
            center,
            end
        )
        colorAnimator?.addUpdateListener { animator ->
            currentColor = animator.animatedValue as Int
            invalidate()
        }
        colorAnimator?.interpolator = FastOutSlowInInterpolator()
        colorAnimator?.duration = 50 // Thời gian hoàn thành animation (ms)
        colorAnimator?.repeatCount = ValueAnimator.INFINITE
        colorAnimator?.start()
    }

    fun changeDuration(duration : Int){
        if(duration!=0){
            colorAnimator?.duration = duration.toLong() // Thời gian hoàn thành animation (ms)
        }
        invalidate()
    }

    init {
        borderPaint.style = Paint.Style.STROKE
        borderPaint.strokeWidth = borderWidth
        borderPaint.pathEffect = DashPathEffect(floatArrayOf(30f, 30f), 0f) // Định dạng line nét đứt

        val vectorDrawable =
            resources.getDrawable(R.drawable.ic_ess) as VectorDrawable
        val bitmap = Bitmap.createBitmap(
            vectorDrawable.intrinsicWidth,
            vectorDrawable.intrinsicHeight,
            Bitmap.Config.ARGB_8888
        )
        val canvas = Canvas(bitmap)
        vectorDrawable.setBounds(0, 0, canvas.width, canvas.height)
        vectorDrawable.draw(canvas)
        resizedAndColoredBitmap = bitmap

        // Tạo một Bitmap có màu sắc đã thay đổi
        //val coloredBitmap = changeBitmapColor(resizedBitmap, Color.BLUE)

        // Khởi tạo và chạy ValueAnimator để thay đổi màu sắc
        colorAnimator = ValueAnimator.ofObject(
            ArgbEvaluator(),
            startColor,
            center,
            endColor
        )
        colorAnimator?.addUpdateListener { animator ->
            currentColor = animator.animatedValue as Int
            invalidate()
        }
        colorAnimator?.interpolator = FastOutSlowInInterpolator()
        colorAnimator?.duration = 3000 // Thời gian hoàn thành animation (ms)
        colorAnimator?.repeatCount = ValueAnimator.INFINITE
        colorAnimator?.start()
    }

    public fun createBitmapByShape(shape: Int) {
        val vectorDrawable =
            resources.getDrawable(shape) as VectorDrawable
        val bitmap = Bitmap.createBitmap(
            vectorDrawable.intrinsicWidth,
            vectorDrawable.intrinsicHeight,
            Bitmap.Config.ARGB_8888
        )
        val canvas = Canvas(bitmap)
        vectorDrawable.setBounds(0, 0, canvas.width, canvas.height)
        vectorDrawable.draw(canvas)
        resizedAndColoredBitmap = bitmap
        invalidate()

    }

    fun updateDynamicWidth(newWidth: Int) {
        dynamicWidth = newWidth.toFloat()
        invalidate() // Yêu cầu View vẽ lại khi width đã thay đổi
    }

    override fun onDraw(canvas: Canvas) {
        Log.d("11111111", "ImageBorderView onDraw")
        super.onDraw(canvas)

        // Vẽ đường viền với màu sắc hiện tại
        var width = width.toFloat() 
        val height = height.toFloat()

        // Kích thước của hình tam giác
        val triangleWidth = resizedAndColoredBitmap?.width ?: 0
        val triangleHeight = resizedAndColoredBitmap?.height ?: 0

        // Số lượng tam giác cần vẽ xung quanh màn hình
        val numTriangles = ((width-padding) / triangleWidth).toInt()
        val numTrianglesY = ((height-padding) / triangleHeight).toInt()
        // Set khoảng cách giữa các hình tam giác
        val spacingX = 2 * triangleWidth
        val spacingY = 2 * triangleHeight

        // Tính toán màu cho từng đoạn của đường viền
        val sectionColors = intArrayOf(startColor, center, endColor)
        val sectionWidth = width / sectionColors.size

        // Vẽ đường viền bao quanh màn hình bằng các tam giác nhỏ
        // Vẽ đường viền bằng các hình tam giác

        val coloredBitmap = changeBitmapColor(resizedAndColoredBitmap!!, currentColor)
        for (i in 0 until numTriangles ) {
            val startX = i.toFloat() * spacingX + padding
            val startY = 0f + padding

            // Vẽ hình tam giác
            canvas.drawBitmap(coloredBitmap!!, startX , startY, null)

            val startY2 = height - triangleHeight - padding
            canvas.drawBitmap(coloredBitmap!!, startX , startY2, null)
        }

        for (i in 0 until numTrianglesY) {
            val startX = 0f + padding
            val startY = i.toFloat() * spacingY + padding

            // Vẽ hình tam giác
            canvas.drawBitmap(coloredBitmap!!, startX, startY, null)

            val startX2 = width - triangleWidth - padding
            canvas.drawBitmap(coloredBitmap!!, startX2, startY, null)
        }

    }
}
