Public Class CalculatorOD

    Dim T As String = "계산"

    Public WithEvents Zone As CZoneOD    '//존에클래스할당
    Public WithEvents AirHandling As CAirHandlingOD    '//존에클래스할당
    Public WithEvents Cooling As CCoolingOD    '//존에클래스할당
    Public WithEvents Heating As CHeatingOD    '//존에클래스할당
    Public WithEvents Renewable As CRenewableOD    '//존에클래스할당
    Public WithEvents Summary As CSummaryOD
    Public WithEvents Pub As CSharedOD

    Public IsError As Boolean = False

    Enum ECalc
        All = 0
        REq = 1
        Use = 2
    End Enum

    Public Sub New(ByVal Version As String)
        Me.IsError = False

        Me.Zone = New CZoneOD '//존
        Me.AirHandling = New CAirHandlingOD   '//공기
        Me.Cooling = New CCoolingOD
        Me.Heating = New CHeatingOD
        Me.Renewable = New CRenewableOD   '//신재상
        Me.Summary = New CSummaryOD   '//계산결과 집계
        Me.Pub = New CSharedOD    '//공용변수
        Me.IsError = Me.Pub.IsError '//공용변수값에 오류확인

        'Select Case Version
        '    Case "2009123100", StartVersion, "2017041400"

        '    Case Else
        '        MsgBox("LG계산식에 지원되지않는 버젼(" & StartVersion & "/" & Version & ")입니다", MsgBoxStyle.Critical, "확인")
        '        Me.IsError = True
        'End Select
    End Sub

    Public Function Start(ByVal CalcType As ECalc, ByRef log As System.Text.StringBuilder) As Boolean
        '//계산을 시작  p_CalcUse : 는 소요량 계산도 할건지으 ㅣ플래그 나중에 분리해야겠따.

        Setup_Zone9()

        'Dim ST As Date = Now
        If Me.IsError Then
            MsgBox("계산준비중 오류발생", MsgBoxStyle.Critical, "확인")
            Return False
        End If
        log = New System.Text.StringBuilder("")
        Dim Cnt As Integer = FixData()
        'log.AppendLine(">>데이터보정(" & Cnt.ToString & ")개의 데이터가 보정되었습니다")
        'log.AppendLine(">>유효성검사시작")
        If Validation() = False Then Return False '//유효성 체크를 수행한다.


        


        '///////////////////////////////////////////////////////////////////////////
        ' 2017. 12. 19
        '///////////////////////////////////////////////////////////////////////////
        '//모드난방기기는 헤더적용
        For Each dr As DS.tbl_nanbangkikiRow In DSET1.tbl_nanbangkiki.Rows
            dr.헤더적용 = True
            dr.개별기기적용 = False
        Next
        DSET1.tbl_nanbangkiki.AcceptChanges()




        If CalcType <> ECalc.Use Then
            'log.AppendLine(">>계산영역초기화")
            Clear_ResultArea()  '//과거의 계산영역을 클리어시킨다.
            'log.AppendLine(">>각존의 사용면적 계산")
            Result1o.사용면적.Calc() '//A_H,C,W,L,V 의 누적값을 계산(사용면적) : 개별프로시져로 할당
            'log.AppendLine(">>주계산시작")
        End If

        Dim Retval As Boolean
        Select Case CalcType
            Case ECalc.All
                Retval = CalcO.Zone.Calc_LoadOfZones
                If Retval Then Retval = CalcO.Zone.Calc_Useage
                Return Retval
            Case ECalc.REq
                Return CalcO.Zone.Calc_LoadOfZones
            Case ECalc.Use
                Return CalcO.Zone.Calc_Useage
        End Select

    End Function

    Private Function FixData() As Integer
        Dim RetCnt As Integer = 0
        Dim Null As String = "(없음)"
        '//보정할수있는데이터를 보정합니다.
        ';//입력면 - 건축부위방식이 .내벽 or 간벽일경우 방위는 (없음)이다
        For Each DR면 As DS.tbl_myounRow In DSET1.tbl_myoun.Select("code <> '0'")
            If DR면.건축부위방식 = "내벽" Or DR면.건축부위방식 = "간벽" Then
                If DR면.방위 <> Null AndAlso DR면.방위 <> "일사없음" Then
                    RetCnt += 1
                    DR면.방위 = Null
                End If
            End If
        Next
        For Each DR존 As DS.tbl_zoneRow In DSET1.tbl_zone.Select("code <> '0'")
            If DR존.조명방식.ToString = "0" OrElse DR존.조명방식.ToString = "" Then
                RetCnt += 1
                Log.AppendLine("Zone " & DR존.설명.ToString & "] 의 조명방식이 없음으로 설정됩니다.")
                DR존.조명방식 = "(없음)"
            End If
            If DR존.인공광원.ToString = "0" OrElse DR존.인공광원.ToString = "" Then
                RetCnt += 1
                Log.AppendLine("Zone " & DR존.설명.ToString & "] 의 인공광원이 없음으로 설정됩니다.")
                DR존.인공광원 = "(없음)"
            End If
            If DR존.외기부하처리여부.ToString = "0" OrElse DR존.외기부하처리여부.ToString = "" Then
                RetCnt += 1
                Log.AppendLine("Zone " & DR존.설명.ToString & "] 의 외기부하처리여부가 아니오로 설정됩니다.")
                DR존.외기부하처리여부 = "아니오"
            End If

            'If DR존.조명방식.ToString.Trim = "" Then DR존.조명방식 = "(없음)"
            'If DR존.인공광원.ToString.Trim = "" Then DR존.인공광원 = "(없음)"
        Next

        DSET1.AcceptChanges()  '//변경내용 적용
        Return RetCnt
    End Function
    Public Function Validation() As Boolean
        '//존이 2개이상있어야한다 (없음데이터로인해서 반드시 1개는 있기때문이다.)
        '//여기보정데이터가잇네요.;
        Dim NoErr As Boolean = True

        '//콤보박스들의 값이 지정되어잇는지 확인한다. 무조건 있어야한다
        Dim Title As String
        Dim Columns() As String '//(없음)이 들어가는 콤보필드 
        Dim ColumnC() As String '//공용코드전용 필드들
        Dim CGubun() As String '//공용코드필드의 구분값이 저장됨
        Dim Columnst() As String    '//0이 들어가는 콤보필드

        '//ZONE
        Title = "Zone"
        Columns = New String() {"냉난방열공급시스템", "열저장능력", "열교가산치",
                                "주말운전방식", "야간운전방식", "외기부하처리여부",
                                "냉난방공조", "냉난방방식",
                                 "조명부하산출방법", "조명방식", "인공광원"}
        ColumnC = New String() {"열저장능력", "열교가산치",
                              "주말운전방식", "야간운전방식", "외기부하처리여부"} '
        '//다를지도 모르니 나중에 함 확인하시구요
        CGubun = New String() {"1023", "1022",
                                "1002", "1002", "1054"}   '//공용코드있는데는 모조리 설정하시구요 물론 길이는 바로위하고 같아야합닌다.
        '//여기에 각 공용코드의 구분값 1009 뭐 이런것들을 같게 넣어주세요 column 가 8개가있었따면 cgubun 도 8개가 잇으면됩니다.

        Columnst = New String() {"프로필", "냉난방공조처리시스템", "열생산난방생산기기",
                                "열생산급탕생산기기", "열생산냉방생산기기",
                                 "열생산가습생산기기", "냉난방공조분배시스템",
                                 "냉난방분배시스템", "공조냉방생산기기", "공조난방생산기기"}

        Set_Null(Columns, DSET1.tbl_zone, "(없음)")   '//데이터를 기본값 셋팅해주는구문이구요 없는데이터는 넓값처리
        Set_Null(ColumnC, DSET1.tbl_zone, "(없음)")   '//공용코드값이 아에없는 데이터를 기본값 셋팅해주는구문이구요 없는데이터는 넓값처리
        'Set_CheckCommon(ColumnC, DSET1.tbl_zone, CGubun)    '//이거는 // 공용코드오류난 데이터 검색하는부분이에요
        Set_Null(Columnst, DSET1.tbl_zone, "0")

        Title = "신재생에너지"
        Columns = New String() {"기기종류", "가동연료", "태양열종류", "집열기유형",
                                "집열판방위", "태양열시스템의성능", "축열탱크설치장소",
                                "태양광모듈기울기", "태양광모듈방위",
                                "태양광모듈종류", "태양광모듈적용타입",
                                "열교환기설치여부", "팽창탱크설치여부"}
        Set_Null(Columns, DSET1.tbl_new, "(없음)")
        'Set_Null(Columnst, DSET1.tbl_bunbae, "0")

        Title = "난방분배시스템"
        Columns = New String() {"생산기기구분", "표준치적용", "배관망유형",
                                "배관구간방식", "배관설치장소",
                                "배관설치장소", "지관장소"}
        Set_Null(Columns, DSET1.tbl_nbunbae, "(없음)")
        'Set_Null(Columnst, DSET1.tbl_bunbae, "0")

        Title = "난방기기"
        Columns = New String() {"연결된시스템",
                                "열생산기기방식", "사용연료", "난방급탕구분"}
        Columnst = New String() {"배관길이", "펌프동력", "보일러정격출력", "보일러대수", "정격보일러효율"}
        Set_Null(Columns, DSET1.tbl_nanbangkiki, "(없음)")
        Set_Null(Columnst, DSET1.tbl_nanbangkiki, "0")

        Title = "냉방기기"
        Columns = New String() {"냉동기방식", "냉동기종류",
                                "냉동기용량", "열성능비",
                                "사용연료"}
        Columnst = New String() {"연결된시스템", "냉수펌프동력", "냉각수펌프동력"}
        Set_Null(Columns, DSET1.tbl_nangbangkiki, "(없음)")
        Set_Null(Columnst, DSET1.tbl_nangbangkiki, "0")


        Title = "입력면"
        Columns = New String() {"건축부위방식", "블라인드유무",
                                "블라인드위치", "방위", "블라인드빛종류",
                                "블라인드색상", "블라인드각도"}
        Columnst = New String() {"존분류", "대차대조존"}
        Set_Null(Columns, DSET1.tbl_myoun, "(없음)")
        Set_Null(Columnst, DSET1.tbl_myoun, "0")


        'Title = "난방공급시스템"
        'Columns = New String() {"열공급시스템", "노출형제어", "바닥난방열제어", _
        '                        "바닥난방열건축부위", "바닥난방전기제어", "바닥난방전기건축부위", "전기난방제어"}
        'Columnst = New String() {"열공급생산기기"}
        'Set_Null(Columns, DSET1.tbl_kongkub, "(없음)")
        'Set_Null(Columnst, DSET1.tbl_kongkub, "0")


        Title = "공조처리"
        Columns = New String() {"공조방식"}
        Set_Null(Columns, DSET1.tbl_kongjo, "(없음)")
        'Set_Null(Columnst, DSET1.tbl_bunbae, "0")

        'Title = "냉방분배시스템"
        ''Columns = New String() {"냉매방식", "펌프운전제어유무"}
        'Columnst = New String() {"냉동기"}
        ''Set_Null(Columns, DSET1.tbl_bunbae, "(없음)")
        'Set_Null(Columnst, DSET1.tbl_bunbae, "0")


        'DSET1.tbl_kongjo.AcceptChanges()
        DSET1.AcceptChanges()


        '//그값이 존에잇어요?cnrkehlsrp?추가된게?공조기기요
        For Each Dr As DS.tbl_zoneRow In DSET1.tbl_zone.Select("code <> '0'") '//모든존을 검사 없음(0)은 빼고
            'If Dr.공조난방생산기기 = "0" And Dr.공조냉방생산기기 = "0" Then '//둘다 0일경우
            '//오류를 내고싶으면 여기서 return false 해버리면됩니다.'다른족건이 잇다면.. 아까처럼..
            'Return False 냉난방공조 라는 공조에 냉난방이 있으면  : :
            'End If


            'If Dr.냉난방공조 = "냉난방" Then '//
            '    If Dr.공조난방생산기기 = "0" OrElse Dr.공조냉방생산기기 = "0" Then
            '        MsgBox("입력존에서 공조방식에 대응하는 공조냉난방생산기기가 지정되지 않은 것이 있습니다.")
            '        Return False
            '    End If
            'End If
            'If Dr.냉난방공조 = "난방" OrElse (Dr.냉난방공조 = "냉방" And Dr.외기부하처리여부 = "예") Then '//
            '    If Dr.공조난방생산기기 = "0" Then
            '        MsgBox("입력존에서 공조방식에 대응하는 공조난방생산기기가 지정되지 않은 것이 있습니다.")
            '        Return False
            '    End If
            'End If
            'If Dr.냉난방공조 = "냉방" OrElse (Dr.냉난방공조 = "난방" And Dr.외기부하처리여부 = "예") Then '//
            '    If Dr.공조냉방생산기기 = "0" Then
            '        MsgBox("입력존에서 공조방식에 대응하는 공조냉방생산기기가 지정되지 않은 것이 있습니다.")
            '        Return False
            '    End If
            'End If
            'If Dr.냉난방공조 = "환기" And Dr.외기부하처리여부 = "예" Then '//
            '    If Dr.공조난방생산기기 = "0" OrElse Dr.공조냉방생산기기 = "0" Then
            '        MsgBox("입력존에서 외기부하처리에 따른 공조냉난방생산기기가 지정되지 않은 것이 있습니다.")
            '        Return False
            '    End If
            'End If
        Next

        '//부위명 업데이트 171021
        For Each drm As DS.tbl_myounRow In DSET1.tbl_myoun.Select("code<>'0'")
            If drm.열관류율2 <> "" Then

                Dim ykcode As String = drm.열관류율2
                Dim dr() As DS.tbl_ykRow = DSET1.tbl_yk.Select("code='" & ykcode & "'")
                If dr.GetUpperBound(0) <> -1 Then
                    Select Case dr(0).면형태
                        Case "외벽(직접)", "0"
                            drm.면형태 = "외벽(직접)"
                        Case "지붕(직접)", "0001"
                            drm.면형태 = "지붕(직접)"
                        Case "바닥(직접)", "0002"
                            drm.면형태 = "바닥(직접)"
                        Case "외벽(간접)", "0003"
                            drm.면형태 = "외벽(간접)"
                        Case "지붕(간접)", "0004"
                            drm.면형태 = "지붕(간접)"
                        Case "바닥(간접)", "0005"
                            drm.면형태 = "바닥(간접)"
                        Case "간벽", "0006"
                            drm.면형태 = "간벽"
                        Case "창(직접)", "창(간접)", "문(직접)", "문(간접)", "세대현관문(직접)", "세대현관문(간접)", "0007", "0008", "0010", "0011", "0012", "0013"
                            If dr(0).면형태 = "0007" Then
                                drm.면형태 = "창(직접)"
                            ElseIf dr(0).면형태 = "0008" Then
                                drm.면형태 = "창(간접)"
                            ElseIf dr(0).면형태 = "0010" Then
                                drm.면형태 = "문(직접)"
                            ElseIf dr(0).면형태 = "0011" Then
                                drm.면형태 = "문(간접)"
                            ElseIf dr(0).면형태 = "0012" Then
                                drm.면형태 = "세대현관문(직접)"
                            ElseIf dr(0).면형태 = "0013" Then
                                drm.면형태 = "세대현관문(간접)"
                            End If
                        Case "지중벽", "0009"
                            drm.면형태 = "지중벽"
                        Case Else
                            drm.면형태 = "--"
                    End Select

                End If
            Else
                drm.면형태 = ""
            End If

        Next
       
        


        '//여기에서 FAlse 를 반환해버리면.. 게산은 돌지않아요 게산전에 수행되는곳이구요
        '//아까 파일오픈시에도 여기를 호출합니다.  바로 윗부분이 nul l값에대한 기본값 처리구요.
        Return NoErr
    End Function

    Private Sub Set_Null(ByVal Columns() As String, ByRef dt As DataTable, ByVal val As String)
        For Each Dr As DataRow In dt.Select("code<>'0'", "code")
            For Each Col As String In Columns
                If Dr(Col) Is DBNull.Value OrElse Dr(Col).ToString.Trim = "" Then '//값이없으면 기본값(val)으로 설정
                    Dr(Col) = val
                End If
            Next
        Next
    End Sub

    '''공용코드에값이있는지확인
    Private Sub Set_CheckCommon(ByVal Columns() As String, ByRef dt As DataTable, ByVal gubunval() As String)
        Dim index As Short = -1
        For Each Dr As DataRow In dt.Select("code<>'0'", "code")
            index = 0
            For Each Col As String In Columns
                If Dr(Col).ToString.Trim = "" Then '//값이없으면 기본값(val)으로 설정
                    'Dr(Col) = val
                Else  '//값이있을때
                    Dim V As String = Dr(Col).ToString.Trim
                    '//v의값이 공용ㅇ코드에 있는지 확인 공용코드는 name 을 저장하므로  name 으로검사를 수행
                    Dim Cdr() As DS.tbl_common_odRow = DSET1.tbl_common_od.Select("gubun='" & gubunval(index) & "' and name='" & V & "'")
                    If Cdr.GetUpperBound(0) = -1 Then
                        MsgBox("값이있으나 공용코드에없음(여기에 경고문구좀 날려주시면되구요")
                    End If
                End If
                index += 1
            Next
        Next
    End Sub


    ''' <summary>
    ''' 계산결과 영역을 초기화시킵니다.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Clear_ResultArea()
        DSETR1.Clear() : DSETR1.AcceptChanges() '//기존데이터 클리어

        '//0번시트의 결과값을 저장할 장소를 생성한다. Zone=00 은 합계필드이다(이것이 일률적이지않아서 00으로 할당을 따로 해서 나중에 합산작업을 할 예정)
        '//00번 존을포함하여 현재 존의 갯수+1개를 생성한다.

        '//최대냉난방/E분석
        Dim ZoneCode As String
        For Each Dr존 As DS.tbl_zoneRow In DSET1.tbl_zone.Select("", "code")
            If Dr존.code = "0" Then
                ZoneCode = "00"
            Else
                ZoneCode = Dr존.code
            End If

            Dim Res1 As DSR.최대냉난방부하Row = DSETR1.최대냉난방부하.New최대냉난방부하Row
            Res1.Zone = ZoneCode : DSETR1.최대냉난방부하.Add최대냉난방부하Row(Res1)
            For ii As Integer = 1 To 12
                Dim DrE분석 As DSR.월별에너지분석Row = DSETR1.월별에너지분석.New월별에너지분석Row
                DrE분석.월 = "M" & Format(ii, "00")  '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함
                DrE분석.존 = ZoneCode
                DSETR1.월별에너지분석.Add월별에너지분석Row(DrE분석)

                'MsgBox("M" & Format(ii, "00"), MsgBoxStyle.Information, ZoneCo'de)
            Next
        Next

        ' MsgBox(DSETR1.월별에너지분석.Select("월='M01'").GetUpperBound(0))


        '//월별로 움직이는데이터
        Dim Mon As String
        Dim Dr As DataRow
        For ii As Integer = 0 To 12
            Mon = "M" & Format(ii, "00")

            Dr = DSETR1.생산에너지.NewRow
            Dr("mon") = Mon  '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함
            DSETR1.생산에너지.Rows.Add(Dr)

            Dr = DSETR1.에너지소요량.NewRow
            Dr("mon") = Mon  '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함
            DSETR1.에너지소요량.Rows.Add(Dr)

            Dr = DSETR1.에너지소요량1.NewRow
            Dr("mon") = Mon  '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함
            DSETR1.에너지소요량1.Rows.Add(Dr)

        Next
        '//전부다시 구성해야함 
        DSETR1.AcceptChanges()
    End Sub


    '''열관류율값ㅇㄹ 반환
    Public Function Get_열관류율(ByVal Dr As DS.tbl_myounRow) As Decimal
        Return TOSG(T, Dr.열관류율)


        'Dim 열관류율2 As String = Dr.열관류율2
        'If 열관류율2 = "" OrElse 열관류율2 = "0" Then '//코드가없으므로 입력값그대로 사용
        '    Return TOSG(T,Dr.열관류율)
        'Else  '//코드값이잇으므로 값을 찾는다.
        '    Try
        '        Dim Drow As DS.tbl_ykRow = DSET1.tbl_yk.Select("code='" & 열관류율2 & "'")(0)
        '        Return TOSG(T,Drow.열관류율) '//코드내에 저장된 값을 보낸다
        '    Catch ex As Exception
        '        MsgBox("열관류율코드값(" & 열관류율2 & ") 값오류" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
        '        Return 0
        '    End Try
        'End If
    End Function




End Class

