Imports System.IO
Imports MySql.Data.MySqlClient

Public Class person

    ' Person Data Variables
    Private _id As Integer                  ' Member ID
    Private _first_name As String           ' First Name
    Private _middle_name As String          ' Middle Name
    Private _last_name As String            ' Last Name
    Private _gender As String               ' Gender
    Private _birthday As Date               ' Date Of Birth
    Private _age As age                     ' Calculated From Birthday
    Private _weight As weight               ' Weight
    Private _picture As MemoryStream        ' Picture

    ' Person Country
    Private _nationality As country         ' Country Object

    ' Person Team / Club
    Private _team As club                   ' Club Object

    '--------------------------------------------------------------------------------------
    '   CONSTRUCTORS
    '--------------------------------------------------------------------------------------

    Public Sub New(Fname As String, Sname As String, Lname As String, DateOfBirth As String, Gender As String, Weight As String, CPR As String, Country As Integer, Mobile As String, Email As String, Address As String, Club As Integer, PictureBox As PictureBox)

        ' Create A New Person
        CREATE(Fname, Sname, Lname, DateOfBirth, Gender, Weight, CPR, Country, Mobile, Email, Address, Club, PictureBox)

        ' Get Person Data From Returned ID
        GetPersonData(_id)

    End Sub

    Public Sub New(ID As Integer)

        If ID = 0 Then
            ZeroID()
        Else
            GetPersonData(ID)
        End If

    End Sub

    '--------------------------------------------------------------------------------------
    '   PROPERTIES
    '--------------------------------------------------------------------------------------

    Public Property ID As Integer
        Get
            Return _id
        End Get
        Set(value As Integer)
            _id = value
            GetPersonData(_id)
        End Set
    End Property

    ReadOnly Property FirstName As String
        Get
            Return _first_name
        End Get
    End Property

    ReadOnly Property LastName As String
        Get
            Return _last_name
        End Get
    End Property

    ReadOnly Property MiddleName As String
        Get
            Return _first_name + " " + _last_name
        End Get
    End Property

    ReadOnly Property ShortName As String
        Get
            Return _first_name + " " + _last_name
        End Get
    End Property

    ReadOnly Property FullName As String
        Get
            Return _first_name + " " + _middle_name + " " + _last_name
        End Get
    End Property

    ReadOnly Property Age As age
        Get
            Return _age
        End Get
    End Property

    ReadOnly Property Birthday As Date
        Get
            Return _birthday
        End Get
    End Property

    ReadOnly Property Weight As weight
        Get
            Return _weight
        End Get
    End Property

    ReadOnly Property Gender As String
        Get
            Return _gender
        End Get
    End Property

    ReadOnly Property Team As club
        Get
            Return _team
        End Get
    End Property

    ReadOnly Property Nationality As country
        Get
            Return _nationality
        End Get
    End Property

    ReadOnly Property Picture As MemoryStream
        Get
            Return _picture
        End Get
    End Property

    '--------------------------------------------------------------------------------------
    '   Create Section
    '--------------------------------------------------------------------------------------

    Public Sub CREATE(Fname As String, Sname As String, Lname As String, DateOfBirth As String, Gender As String, Weight As String, CPR As String, Country As Integer, Mobile As String, Email As String, Address As String, Club As Integer, PictureBox As PictureBox)

        Dim QRY As String = ("
            insert into 
            person 	(fname, mname, lname, country, gender, date_of_birth, weight, cpr, mobile, email, address, club, picture)
            values	('" & Fname & "', '" & Sname & "', '" & Lname & "', " & Country & ", '" & Gender & "', '" & DateOfBirth & "', '" & Weight & "', '" & CPR & "', '" & Mobile & "', '" & Email & "', '" & Address & "', " & Club & ", @picture);

            select last_insert_id() as 'id';
        ")

        ' Generate Weight Object
        _weight = New weight(ReadMySQLDate(DateOfBirth), Gender, CDbl(Val(Weight)))

        ' Connection
        Dim CON As New MySqlConnection(CON_STRING)
        Dim COM As New MySqlCommand(QRY, CON)

        Dim Picture As New MemoryStream
        PictureBox.Image.Save(Picture, System.Drawing.Imaging.ImageFormat.Png)
        Dim arrImage() As Byte = Picture.GetBuffer
        Picture.Close()


        Dim RDR As MySqlDataReader

        Try
            CON.Open()
            COM.Parameters.AddWithValue("@picture", arrImage)
            RDR = COM.ExecuteReader
            If RDR.HasRows = True Then

                While RDR.Read

                    Try ' ID
                        _id = RDR("id")
                    Catch ex As Exception
                        _id = 0
                    End Try

                End While

            End If
            CON.Close()
        Catch ex As MySqlException
            MessageBox.Show(ex.Message)
        End Try

        ' Updating Weight
        UpdateWeight(CDbl(Val(Weight)))

    End Sub


    '--------------------------------------------------------------------------------------
    '   Update Section
    '--------------------------------------------------------------------------------------

    Public Sub UpdatePicture(PictureBox As PictureBox)

        ' Query To Update
        Dim QRY As String = "update person set picture = @picture where id=" & _id

        ' Connection
        Dim CON As New MySqlConnection(CON_STRING)
        Dim COM As New MySqlCommand(QRY, CON)

        ' Preparing The Image
        Dim Picture As New MemoryStream
        PictureBox.Image.Save(Picture, System.Drawing.Imaging.ImageFormat.Png)
        Dim arrImage() As Byte = Picture.GetBuffer
        Picture.Close()

        Try
            CON.Open()
            COM.Parameters.AddWithValue("@picture", arrImage)
            COM.ExecuteNonQuery()
            CON.Close()
        Catch ex As MySqlException
            MessageBox.Show(ex.Message)
        Finally
            CON.Dispose()
        End Try

    End Sub


    '--------------------------------------------------------------------------------------
    '   SUBROUTINES
    '--------------------------------------------------------------------------------------

    Private Sub GetPersonData(FighterID As Integer)

        Dim QRY As String =
        ("
            select
	            person.id as 'pid',
	            person.fname,
                person.mname,
                person.lname,
                TIMESTAMPDIFF(YEAR, person.date_of_birth, CURDATE()) as 'age',
                person.date_of_birth,
                person.weight,
	            person.gender,
                person.country as 'country',
                clubs.id as 'club',
                person.picture as 'picture'
            FROM 
	            person
            left join
	            clubs on person.club = clubs.id
            left join 
	            countries on clubs.country = countries.id 
            where 
	            person.id=" + FighterID.ToString
        )

        Dim CON As New MySqlConnection(CON_STRING)
        Dim COM As New MySqlCommand(QRY, CON)
        Dim RDR As MySqlDataReader

        Try
            CON.Open()
            RDR = COM.ExecuteReader
            If RDR.HasRows = True Then

                While RDR.Read

                    Try ' ID
                        _id = RDR("pid")
                    Catch ex As Exception
                        _id = 0
                    End Try

                    Try ' First Name
                        _first_name = RDR("fname")
                    Catch ex As Exception
                        _first_name = Nothing
                    End Try

                    Try ' Middle Name
                        _middle_name = RDR("mname")
                    Catch ex As Exception
                        _middle_name = Nothing
                    End Try

                    Try ' Last Name
                        _last_name = RDR("lname")
                    Catch ex As Exception
                        _last_name = Nothing
                    End Try

                    Try ' Gender
                        _gender = RDR("gender")
                    Catch ex As Exception
                        _gender = Nothing
                    End Try

                    Try ' Birthday
                        _birthday = CDate(RDR("date_of_birth"))
                    Catch ex As Exception
                        _birthday = Nothing
                    End Try

                    Try ' Age
                        _age = New age(_birthday)
                    Catch ex As Exception
                        _age = Nothing
                    End Try

                    Try ' Weight
                        _weight = New weight(_birthday, _gender, RDR("weight"))
                    Catch ex As Exception
                        _weight = Nothing
                    End Try

                    Try ' Team Name
                        _team = New club(RDR("club"))
                    Catch ex As Exception
                        _team = Nothing
                    End Try

                    Try ' Country
                        _nationality = New country(RDR("country"))
                    Catch ex As Exception
                        _nationality = Nothing
                    End Try

                    Try ' Fighter Picture -------------------------------------------
                        Dim data As Byte() = DirectCast(RDR("picture"), Byte())
                        _picture = New System.IO.MemoryStream(data)
                    Catch ex As Exception
                        _picture = Nothing
                    End Try

                End While
            End If
            CON.Close()
        Catch ex As MySqlException
            MessageBox.Show(ex.Message)
        End Try

    End Sub

    '--------------------------------------------------------------------------------------
    '   FUNCTIONS
    '--------------------------------------------------------------------------------------

    Public Sub UpdateWeight(Weight As Double)

        ' This Updates The Weight Of The Person
        _weight.UpdateWeight(Me._id, Weight)

    End Sub

    '--------------------------------------------------------------------------------------
    '   Zero ID Person
    '--------------------------------------------------------------------------------------

    Private Sub ZeroID()

        _id = 0
        _first_name = "B"
        _middle_name = "Y"
        _last_name = "E"
        _gender = "EXGEN"
        _birthday = ""
        _age = Nothing
        _weight = Nothing
        _picture = Nothing
        _team = Nothing
        _nationality = Nothing

    End Sub

End Class