Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Windows.Forms
Imports Nexamas.UI.Components
Imports Nexamas.UI.General
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.Scroll
Imports Nexamas.UI.SkiaScroll
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Layout
Imports SkiaSharp

Namespace Nexamas.UI.FloatRuntime

    Partial Friend NotInheritable Class MASMessageBoxFloatContent
#Region "Helpers"

        Private Shared Function NormalizeRequest(source As MessageBoxRequest) As MessageBoxRequest

            Dim request As MessageBoxRequest =
                If(source, New MessageBoxRequest())

            request.Title = If(request.Title, String.Empty)
            request.Message = If(request.Message, String.Empty)
            request.Detail = If(request.Detail, String.Empty)

            If request.Buttons Is Nothing OrElse request.Buttons.Count = 0 Then
                request.Buttons = MessageBoxPresets.OK()
            End If

            If request.ButtonResults Is Nothing OrElse
               request.ButtonResults.Count <> request.Buttons.Count Then

                Dim results As New List(Of MessageBoxResult)()

                For i As Integer = 0 To request.Buttons.Count - 1
                    results.Add(MessageBoxResultResolver.Resolve(request, request.Buttons(i), i))
                Next

                request.ButtonResults = results
            End If

            If request.DefaultResult = MessageBoxResult.None Then
                request.DefaultResult = MessageBoxResult.OK
            End If

            If request.EscapeResult = MessageBoxResult.None Then
                request.EscapeResult = MessageBoxResult.Close
            End If

            If request.CompanyIcon Is Nothing Then
                request.CompanyIcon = New MessageBoxCompanyIconSpec()
            End If

            request.CheckBoxText = If(request.CheckBoxText, String.Empty)

            If Not request.ShowCheckBox Then
                request.CheckBoxChecked = False
            End If

            Return request

        End Function

        Private Function HitButtonIndex(ptPx As SKPoint) As Integer

            If _layout Is Nothing Then Return -1
            If _layout.ButtonRects Is Nothing Then Return -1

            For i As Integer = 0 To _layout.ButtonRects.Count - 1
                If Contains(_layout.ButtonRects(i), ptPx) Then
                    Return i
                End If
            Next

            Return -1

        End Function

        Private Function IsCheckBoxHit(ptPx As SKPoint) As Boolean

            If _layout Is Nothing Then Return False
            If Not _request.ShowCheckBox Then Return False

            Return Contains(_layout.CheckBoxRowRect, ptPx) OrElse
                   Contains(_layout.CheckBoxBoxRect, ptPx) OrElse
                   Contains(_layout.CheckBoxTextRect, ptPx)

        End Function

        Private Sub ClampScrollOffset()

            If _layout Is Nothing Then
                _state.ContentScrollOffsetY = 0.0F
                Return
            End If

            Dim maxY As Single =
                Math.Max(0.0F, _layout.MaxContentScrollOffsetY)

            If _state.ContentScrollOffsetY < 0.0F Then
                _state.ContentScrollOffsetY = 0.0F
            ElseIf _state.ContentScrollOffsetY > maxY Then
                _state.ContentScrollOffsetY = maxY
            End If

        End Sub

        Private Sub ResetPointerState(Optional clearHover As Boolean = True)

            _pressedButtonIndex = -1
            _pressedClose = False
            _pressedCheckBox = False

            If _state IsNot Nothing Then
                _state.ClosePressed = False
                _state.CheckBoxPressed = False

                If clearHover Then
                    _state.CloseHover = False
                    _state.CheckBoxHover = False
                End If
            End If

            ClearButtonPressedStates()

            If clearHover Then
                ClearButtonHoverStates()
            End If

        End Sub

        Private Shared Function Contains(rect As SKRect,
                                         pt As SKPoint) As Boolean

            If rect.IsEmpty Then Return False

            Return pt.X >= rect.Left AndAlso
                   pt.X <= rect.Right AndAlso
                   pt.Y >= rect.Top AndAlso
                   pt.Y <= rect.Bottom

        End Function

        Private Sub RequestInvalidate()

            If _invalidate Is Nothing Then Return

            Try
                _invalidate.Invoke()
            Catch masCaughtException2 As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowBoundary(masCaughtException2, "MessageBox.Float.RequestInvalidate")
            End Try

        End Sub

#End Region
    End Class

End Namespace
