Imports System.Collections
Imports System.IO
Imports System.IO.Compression

'**************************************************************************
' Name       :MyFile
'--------------------------------------------------------------------------
' Comment    :投票ファイルのIOクラス
'            :※投票ファイルのI/Oについては、このクラスに集約する。
'--------------------------------------------------------------------------
' Design On  :2013/01/31
'        By  :NCS)T.Kikuchi
'--------------------------------------------------------------------------
' Update On  :2019/8/25
'        By  :MEC)T.Hashimoto
' Comment    :
'**************************************************************************
Public Class MyFile
    Implements IDisposable


    Dim dir As String

    Public Sub New()
        ' フォルダパス（投票フォルダパス＋選挙コード）
        dir = MyProperty.システムＭ.投票フォルダパス + MyProperty.システムＭ.選挙コード + "\"
    End Sub

    Public Sub Dispose() Implements IDisposable.Dispose
    End Sub

    Public Function Get投票ファイル名(ByRef _選挙コード As String, ByRef _選挙ID As String, _
                               ByRef _投票所コード As String, ByVal _投票者ID As String) As String

        ' 形式は、[選挙ｺｰﾄﾞ]_[選挙ID]_[投票所ｺｰﾄﾞ]_[投票者ID].txt
        Dim filename As String = _選挙コード + "_" + _選挙ID + "_" + _投票所コード + "_" + _投票者ID + ".txt"
        Return filename
    End Function

    Public Sub Save投票ファイル(ByVal filename As String, ByVal _選挙ID As String, ByVal _候補者ID As String, _
                          ByVal _投票数 As String, ByVal _投票所コード As String, ByVal timestamp As DateTime)

        Dim isError As Boolean = False

        Try
            ' フォルダパスの編集（選挙コード＋選挙ID＋投票所コード）
            'Dim di As String = dir + _選挙ID + "\" + MyProperty.システムＭ.投票所コード + "\"
            Dim di As String = dir + _選挙ID + "\" + _投票所コード + "\"
            If Not Directory.Exists(di) Then
                ' フォルダがなければ新規作成する
                Directory.CreateDirectory(di)
            End If

            Using writer As StreamWriter = New StreamWriter(di + filename, False)
                writer.WriteLine(_候補者ID)
                writer.WriteLine(_投票数)
                writer.WriteLine(timestamp.ToString("yyyy/MM/dd HH:mm:ss.fff"))
            End Using
        Catch ex As Exception
            ' エラーログ出力
            MyLog.AddWarningLog(MyMessage.ログ.投票ファイル出力失敗 + ex.Message)

            isError = True
        End Try

        ' バックアップフォルダにも出力する
        Try
            ' フォルダパスの編集（選挙コード＋選挙ID＋投票所コード）
            'Dim di As String = MyProperty.システムＭ.投票バックアップフォルダパス + _
            '    MyProperty.システムＭ.選挙コード + "\" + _選挙ID + "\" + MyProperty.システムＭ.投票所コード + "\"
            Dim di As String = MyProperty.システムＭ.投票バックアップフォルダパス + _
                MyProperty.システムＭ.選挙コード + "\" + _選挙ID + "\" + _投票所コード + "\"
            If Not Directory.Exists(di) Then
                ' フォルダがなければ新規作成する
                Directory.CreateDirectory(di)
            End If

            Using writer As StreamWriter = New StreamWriter(di + filename, False)
                writer.WriteLine(_候補者ID)
                writer.WriteLine(_投票数)
                writer.WriteLine(timestamp.ToString("yyyy/MM/dd HH:mm:ss.fff"))
            End Using
        Catch ex As Exception
            ' エラーログ出力
            MyLog.AddWarningLog(MyMessage.ログ.投票バックアップファイル出力失敗 + ex.Message)

            If isError Then
                ' 両方のフォルダともに出力失敗の場合、システムエラー画面を表示する
                Throw New Exception(MyMessage.ログ.投票ファイル両方出力失敗)
            End If
        End Try
    End Sub

    Public Sub Delete投票ファイル()
        ' 選挙コードフォルダを、フォルダごと削除する
        If Directory.Exists(dir) Then
            Directory.Delete(dir, True)
        End If

        ' バックアップフォルダ
        Dim bk_dir As String = MyProperty.システムＭ.投票バックアップフォルダパス + MyProperty.システムＭ.選挙コード
        If Directory.Exists(bk_dir) Then
            Directory.Delete(bk_dir, True)
        End If
    End Sub

    Private Sub CopyDirectory(ByVal sourceDirName As String, ByVal destDirName As String)
        Throw New NotImplementedException
    End Sub

    'Public Function Count投票数By候補者ID(ByVal senkyoId As String, ByVal kohoId As String, ByVal isAll As Boolean) As Integer
    Public Function Count投票数By候補者ID(ByVal senkyoId As String, ByVal kohoId As String, ByVal isAll As Boolean, ByRef pFiles() As FileInfo) As Integer

        Dim cnt As Integer = 0

        '投票ファイルフォルダを取得()
        dir += senkyoId + "\"
        'If Not isAll Then
        '    dir += MyProperty.システムＭ.投票所コード + "\"
        'End If

        'readフォルダにコピーした投票ファイルを読込対象にする_Hashimoto
        Dim cdir As String
        cdir = MyProperty.システムＭ.投票フォルダパス + "read"

        Dim di As DirectoryInfo
        If isAll Then
            'dir += MyProperty.システムＭ.投票所コード + "\"
            di = New DirectoryInfo(dir)
        Else
            di = New DirectoryInfo(cdir)
        End If

        'エラー取得用_Hashimoto
        Dim e1 As String = Nothing
        Dim e2 As String = Nothing
        If di.Exists Then
            Dim files() As FileInfo = di.GetFiles("*", IO.SearchOption.AllDirectories)

            '1ファイルずつ開いて中身を調べる
            For Each file As FileInfo In files
                Dim vals As List(Of String) = New List(Of String)
                Using sr As StreamReader = New StreamReader(file.FullName)
                    While (sr.Peek() >= 0)
                        ' ファイルを1行ずつ読み込む
                        vals.Add(sr.ReadLine())
                    End While
                End Using

                If vals.Count > 1 Then
                    ' 1行目が候補者ID
                    If vals(0) = kohoId Then
                        ' 2行目が投票数
                        cnt += Convert.ToInt32(vals(1))
                    End If
                Else
                    e1 = files.ToString
                End If
            Next
            pFiles = files
        End If

        Return cnt

    End Function

    Public Sub Fill日時投票数(ByVal senkyoId As String, ByVal ds As DataSet1, ByVal isHourly As Boolean, ByVal votePlaceValue As String)
        ' 対象のフォルダ以下を対象とする。
        dir += senkyoId + "\"
        'If Not isAll Then
        '    dir += MyProperty.システムＭ.投票所コード + "\"
        'End If

        If votePlaceValue <> MyConstant.全投票所コード Then
            dir += votePlaceValue + "\"
        End If

        Dim di As DirectoryInfo = New DirectoryInfo(dir)
        If di.Exists Then
            Dim files() As FileInfo = di.GetFiles("*", IO.SearchOption.AllDirectories)

            For Each file As FileInfo In files
                ' ファイル属性から日時を取得し、カウントアップ
                Dim d As String
                If isHourly Then
                    d = file.LastWriteTime.ToString("yyyyMMddHH")
                Else
                    d = file.LastWriteTime.ToString("yyyyMMdd")
                End If
                If IsNothing(ds.集計結果日時T.FindBy選挙ID日時(senkyoId, d)) Then
                    ds.集計結果日時T.Add集計結果日時TRow(senkyoId, d, 1)
                Else
                    ds.集計結果日時T.FindBy選挙ID日時(senkyoId, d).投票数 += 1
                End If
            Next
        End If
    End Sub

End Class
