Option Explicit On
Option Strict On

Public Class Building
  ' To jest klasa bazowa, z której wyprowadzamy
  ' klasy Apartment, Commercial i Home.

  ' =============== Stałe symboliczne ================
  Private Const APARTMENT As Integer = 0
  Private Const COMMERCIAL As Integer = 1
  Private Const HOME As Integer = 2

  ' ================== Dane składowe  ==================

  Private mAddress As String     ' Adres
  Private mPrice As Double       ' Cena nabycia
  Private mMonthlyPayment As Double  ' Opłaty miesięczne
  Private mTaxes As Double       ' Roczne podatki
  Private mType As Integer       ' Typ budynku

  ' ==================== Właściwości ======================
  Public Property Address() As String ' Właściwość Adres
    Get
      Return mAddress
    End Get

    Set(ByVal Value As String)
      mAddress = Value
    End Set
  End Property

  Public Property PurchasePrice() As Double  ' Właściwość Cena nabycia
    Get
      Return mPrice
    End Get

    Set(ByVal Value As Double)
      mPrice = Value
    End Set
  End Property

  Public Property MonthlyPayment() As Double ' Właściwość Opłata miesięczna 
    Get
      Return mMonthlyPayment
    End Get

    Set(ByVal Value As Double)
      mMonthlyPayment = Value
    End Set
  End Property

  Public Property Taxes() As Double   ' Właściwość Podatek od nieruchomości
    Get
      Return mTaxes
    End Get

    Set(ByVal Value As Double)
      mTaxes = Value
    End Set
  End Property

  Public Property BuildingType() As Integer   ' Właściwość Typ budynku
    Get
      Return mType
    End Get

    Set(ByVal Value As Integer)
      If Value < APARTMENT OrElse Value > HOME Then
        mType = -1  ' błąd
      Else
        mType = Value
      End If
    End Set
  End Property

  ' ========================== Metody ========================
  Protected Sub DisplayBaseInfo()
    ' Cel: wyświetlanie bazowych danych składowych 
    Dim BldType As String

    Console.WriteLine("Adres: " & mAddress)
    Console.WriteLine("Cena nabycia: " & FormatMoney(mPrice))
    Console.WriteLine("Opłata miesieczna: " & _ 
                       FormatMoney(mMonthlyPayment))
    Console.WriteLine("Podatek od nieruchomosci: " & FormatMoney(mTaxes))
    Select Case mType
      Case APARTMENT
        BldType = "Blok mieszkalny"
      Case COMMERCIAL
        BldType = "Komercyjny"
      Case HOME
        BldType = "Dom"
    End Select
    Console.WriteLine("Typ budynku: " & BldType)
  End Sub

  ' ======================= Programy pomocnicze =====================
  Protected Function FormatMoney(ByVal num As Double) As String
    ' Cel: formatowanie wartości dolara
    '
    ' Argumenty:
    '  num  Liczba double, która jest wartością w dolarach do formatowania
    '
    ' Zwracana wartość:
    '  string   Łańcuch wartości w formacie dolara 

    Return Format(num, "$##########.00")
  End Function
End Class
