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 "Completion"

        Private Sub Complete(result As MessageBoxResult)

            If result = MessageBoxResult.None Then
                result = MessageBoxResult.Close
            End If

            Complete(result, ResolveCloseReason(result))

        End Sub

        Private Sub Complete(result As MessageBoxResult,
                             closeReason As MASFloatCloseReason)

            If _disposed Then Return

            If result = MessageBoxResult.None Then
                result = MessageBoxResult.Close
            End If

            Dim session As IMASFloatSession = _session
            If session Is Nothing Then Return

            Dim floatResult As MASFloatResult = CreateFloatResult(result)

            session.Complete(floatResult, closeReason)

        End Sub

        Private Shared Function CreateFloatResult(result As MessageBoxResult) As MASFloatResult

            Select Case result
                Case MessageBoxResult.Cancel,
                     MessageBoxResult.No
                    Return MASFloatResult.Cancelled(result)

                Case MessageBoxResult.Close
                    Return MASFloatResult.Dismissed(result)

                Case Else
                    Return MASFloatResult.Accepted(result)
            End Select

        End Function

        Private Shared Function ResolveCloseReason(result As MessageBoxResult) As MASFloatCloseReason

            Select Case result
                Case MessageBoxResult.Cancel,
                     MessageBoxResult.No
                    Return MASFloatCloseReason.Cancelled

                Case MessageBoxResult.Close
                    Return MASFloatCloseReason.Cancelled

                Case Else
                    Return MASFloatCloseReason.Accepted
            End Select

        End Function

        Private Function ResolveButtonResult(index As Integer) As MessageBoxResult

            If index < 0 Then Return MessageBoxResult.None

            If _request.ButtonResults IsNot Nothing AndAlso
               index < _request.ButtonResults.Count Then

                Dim mapped As MessageBoxResult = _request.ButtonResults(index)

                If mapped <> MessageBoxResult.None Then
                    Return mapped
                End If
            End If

            Dim buttons As IReadOnlyList(Of MASButtonSpec) =
                MessageBoxLayoutEngine.GetSafeButtons(_request)

            If buttons IsNot Nothing AndAlso index < buttons.Count Then
                Return MessageBoxResultResolver.Resolve(_request, buttons(index), index)
            End If

            Return MessageBoxResult.None

        End Function

#End Region
    End Class

End Namespace
