Imports NLog
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Windream
Imports DigitalData.Modules.Language
Imports DigitalData.Modules.Base

Public Class ConnectionBuilder
    Implements IConnectionBuilder

    Private ReadOnly LogConfig As LogConfig
    Private SessionReconnect As Boolean = False
    Private DriveLetter As String = "W"
    Private BasePath As String = BASE_PATH
    Private Support64Bit As Boolean = False
    Private ServerName As String = Nothing
    Private UserName As String = Nothing
    Private Password As String = Nothing
    Private Domain As String = Nothing

    Private Const BASE_PATH As String = "\\windream\objects"

    Public Sub New(LogConfig As LogConfig)
        Me.LogConfig = LogConfig
    End Sub

    ''' <summary>
    ''' Sets flag in Windream class to reconnect on lost connection
    ''' </summary>
    ''' <returns>A IConnectionBuilder instance to allow for chaining</returns>
    Public Function WithSessionReconnect() As IConnectionBuilder Implements IConnectionBuilder.WithSessionReconnect
        SessionReconnect = True
        Return Me
    End Function

    ''' <summary>
    ''' Sets the drive letter of windream drive, default is "W"
    ''' </summary>
    ''' <param name="driveLetter">The drive letter to use</param>
    ''' <returns>A IConnectionBuilder instance to allow for chaining</returns>
    Public Function WithDriveLetter(driveLetter As String) As IConnectionBuilder Implements IConnectionBuilder.WithDriveLetter
        Me.DriveLetter = driveLetter
        BasePath = String.Empty
        Return Me
    End Function

    ''' <summary>
    ''' Sets the drive letter to String.Empty, use \\windream\objects as Windream base path
    ''' </summary>
    ''' <param name="BasePath">The windream base path, eg. \\windream\objects</param>
    ''' <returns>A IConnectionBuilder instance to allow for chaining</returns>
    Public Function WithWindreamObjects(BasePath As String) As IConnectionBuilder Implements IConnectionBuilder.WithWindreamObjects
        BasePath = BasePath
        DriveLetter = String.Empty
        Return Me
    End Function

    ''' <summary>
    ''' Sets the drive letter to String.Empty, use \\windream\objects as Windream base path
    ''' </summary>
    ''' <returns>A IConnectionBuilder instance to allow for chaining</returns>
    Public Function WithWindreamObjects() As IConnectionBuilder Implements IConnectionBuilder.WithWindreamObjects
        BasePath = BASE_PATH
        DriveLetter = String.Empty
        Return Me
    End Function

    Public Function WithWindreamObjectsOrDriveLetter(BasePath As String, DriveLetter As String) As IConnectionBuilder Implements IConnectionBuilder.WithWindreamObjectsOrDriveLetter
        If ObjectEx.NotNull(BasePath, Nothing) IsNot Nothing Then
            Return WithWindreamObjects(BasePath)
        ElseIf ObjectEx.NotNull(DriveLetter, Nothing) IsNot Nothing Then
            Return WithDriveLetter(DriveLetter)
        Else
            Return WithWindreamObjects()
        End If
    End Function

    ''' <summary>
    ''' Sets flag in Windream class to indicate 64-bit support
    ''' </summary>
    ''' <returns>A IConnectionBuilder instance to allow for chaining</returns>
    Public Function With64BitSupport() As IConnectionBuilder Implements IConnectionBuilder.With64BitSupport
        Support64Bit = True
        Return Me
    End Function

    ''' <summary>
    ''' Sets the servername in Windream class, overriding the client setting
    ''' </summary>
    ''' <param name="serverName"></param>
    ''' <returns>A IConnectionBuilder instance to allow for chaining</returns>
    Public Function WithServerName(serverName As String) As IConnectionBuilder Implements IConnectionBuilder.WithServerName
        Me.ServerName = serverName
        Return Me
    End Function

    ''' <summary>
    ''' Sets the username, password and domain in Windream class, overriding the client settings
    ''' </summary>
    ''' <param name="userName">The username used for the connection</param>
    ''' <param name="password">The password used for the connection</param>
    ''' <param name="domain">The domain used for the connection</param>
    ''' <returns>A IConnectionBuilder instance to allow for chaining</returns>
    Public Function WithImpersonation(userName As String, password As String, domain As String) As IConnectionBuilder Implements IConnectionBuilder.WithImpersonation
        Me.UserName = userName
        Me.Password = password
        Me.Domain = domain
        Return Me
    End Function

    ''' <summary>
    ''' Creates a connection.
    ''' </summary>
    ''' <exception cref="Exceptions.SessionException">If there was an error while establishing the connection</exception>
    ''' <returns>A Windream Object</returns>
    Public Function Connect() As Windream Implements IConnectionBuilder.Connect
        Return New Windream(LogConfig, SessionReconnect, DriveLetter, BasePath, Support64Bit, ServerName, UserName, Password, Domain)
    End Function

End Class
