# CustomCircularProgressBar.kt

    /*
     * The MIT License
     *
     * Original work sponsored and donated by The Danish Health Data Authority (http://www.sundhedsdatastyrelsen.dk)
     *
     * Copyright (C) 2021 The Danish Health Data Authority (http://www.sundhedsdatastyrelsen.dk)
     *
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy of
     * this software and associated documentation files (the "Software"), to deal in
     * the Software without restriction, including without limitation the rights to
     * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
     * of the Software, and to permit persons to whom the Software is furnished to do
     * so, subject to the following conditions:
     *
     *
     * The above copyright notice and this permission notice shall be included in all
     * copies or substantial portions of the Software.
     *
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     * SOFTWARE.
     */

    package dk.nsp.mingraviditet.ui.main.overview.widget

    import android.content.Context
    import android.graphics.*
    import android.util.AttributeSet
    import androidx.annotation.DimenRes
    import androidx.core.graphics.toRectF
    import dk.nsp.mingraviditet.R
    import dk.nsp.mingraviditet.util.extensions.getColorFromAttr

    open class CustomCircularProgressBar @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
    ) : InnerShadowCircleView(context, attrs, defStyleAttr) {

        private val defaultProgressBarWidth = resources.getDimensionPixelSize(R.dimen.overview_baby_progress_bar_width).toFloat()

        var progressBarWidth = defaultProgressBarWidth
            private set

        // Offset according to the progress bar width and a percentage based padding of the width
        val contentOffset = innerShadowContentOffset + progressBarWidth * 1.2

        private val progressPaint by lazy {
            Paint().also {
                it.color = context.getColorFromAttr(R.attr.colorPrimary)
                it.style = Paint.Style.STROKE
                it.strokeCap = Paint.Cap.ROUND
                it.isAntiAlias = true
                it.strokeWidth = progressBarWidth
            }
        }

        private val progressPath by lazy {
            Path()
        }

        private val drawingRect by lazy {
            Rect()
        }

        var progressInPercentage: Int = 0
            set(value) {
                field = value
                invalidate()
            }

        override fun onDraw(canvas: Canvas?) {
            super.onDraw(canvas)

            progressPath.reset()
            progressPath.addArc(
                updatedDrawingRect(),
                270f,
                (360 / 100f) * progressInPercentage
            )

            canvas?.drawPath(progressPath, progressPaint)
        }

        private fun setProgressBarWidth(@DimenRes newWidthRes: Int) {
            progressBarWidth = resources.getDimensionPixelSize(newWidthRes).toFloat().also {
                progressPaint.strokeWidth = it
            }

            invalidate()
        }

        private fun updatedDrawingRect(): RectF {
            getDrawingRect(drawingRect)
            return drawingRect.toRectF().also {
                // Add offset according to inner shadow radius and progress bars width (Since half of the bar would be outside, since it's a stroke on the path)
                val offset = innerShadowContentOffset + (progressBarWidth/2f)
                it.left = it.left + offset
                it.top = it.top + offset
                it.right = it.right - offset
                it.bottom = it.bottom - offset
            }
        }

    }