Imports System.Web.Services
Imports System.Web.Script.Services
Imports System.IO

Public Class ReportKoho
    Inherits System.Web.UI.Page

    Private Const CON_EXCEL_NAME As String = "集計結果報告書"

    Protected maxValue As String = String.Empty

    ''' <summary>
    ''' 初期処理
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub Page_Init1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

        'プログレスバーの最大値設定
        maxValue = GetFileCount()


    End Sub

    ''' <summary>
    ''' ロードイベント
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Chk_O1.Checked Or Chk_O2.Checked Then
        Else
            Chk_O1.Checked = True
        End If
        If Not IsPostBack Then
            Page.Header.Title = MyProperty.システムＭ.選挙コード名称 + MyConstant.管理画面タイトル

            ' 投票所Mを取得する
            Dim ds As DataSet1 = New DataSet1
            Using myDataBase As MyDataBase = New MyDataBase
                myDataBase.Fill投票所M全件(ds)
            End Using

            Dim dt As New DataTable()
            dt.Columns.Add("Code")
            dt.Columns.Add("Name")
            dt.Rows.Add(MyConstant.全投票所コード, "全投票所")

            For Each row As DataSet1.投票所MRow In ds.投票所M
                dt.Rows.Add(row.投票所コード.Trim(), row.投票所名.Trim())
            Next

            DropDownList1.DataSource = dt
            DropDownList1.DataTextField = "Name"   ' 表示される列
            DropDownList1.DataValueField = "Code"  ' 内部的な値の列
            DropDownList1.DataBind()

        End If

        ''BtnDownload.OnClientClick = "document.getElementById('" + msg.ClientID + "').innerText = '集計中です'"

    End Sub

    ''' <summary>
    ''' 「集計」ボタンをクリックした際のコードビハインド処理
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub BtnDownload_Click(sender As Object, e As EventArgs) Handles BtnDownload.Click

        ' 選挙Mを取得する
        Dim ds As DataSet1 = New DataSet1
        Using myDataBase As MyDataBase = New MyDataBase
            myDataBase.Fill選挙M(ds)
        End Using

        ''プログレスバーの表示
        'PnlProgress.Minimum = 0
        'ProgressBar1.Maximum = 10
        'ProgressBar1.Value = 0
        'Label1.Text = "0"
        ''時間のかかる処理を開始する
        'Dim i As Integer
        'For i = 1 To 10
        '    '1秒間待機する（時間のかかる処理があるものとする）
        '    System.Threading.Thread.Sleep(1000)

        '    'ProgressBar1の値を変更する
        '    ProgressBar1.Value = i
        '    'Label1のテキストを変更する
        '    Label1.Text = i.ToString()
        'Next

        ''結果を報告する
        'Label1.Text = "完了しました。"

        '投票所の選択値・選択した名称
        Dim votePlaceValue As String = DropDownList1.SelectedValue
        Dim votePlaceText As String = DropDownList1.SelectedItem.Text

        ' ドロップダウンで全投票所が選択されていたら、
        ' 「全投票所フォルダを集計対象とする」にチェックを入れる（既存処理を流用）
        If DropDownList1.SelectedValue.Equals(MyConstant.全投票所コード) Then
            ChkAll.Checked = True
        Else
            ChkAll.Checked = False
        End If

        ' 集計用に投票データフォルダをコピー_Hashimoto
        Dim dir As String
        For Each sID As DataSet1.選挙MRow In ds.選挙M
            If ChkAll.Checked Then
                dir = MyProperty.システムＭ.投票フォルダパス + MyProperty.システムＭ.選挙コード + "\"
            Else
                dir = MyProperty.システムＭ.投票フォルダパス + MyProperty.システムＭ.選挙コード + "\"
                'dir += sID.選挙ID.TrimEnd + "\" + MyProperty.システムＭ.投票所コード + "\"
                dir += sID.選挙ID.TrimEnd + "\" + votePlaceValue + "\"
            End If

            If Directory.Exists(dir) = False Then
                LblMessage.Text = "投票済みデータがありません"
                Return
            End If

            Dim cdir As String = MyProperty.システムＭ.投票フォルダパス + "read"
            If System.IO.File.Exists(cdir) Then
                My.Computer.FileSystem.DeleteDirectory(cdir, FileIO.RecycleOption.SendToRecycleBin)
                My.Computer.FileSystem.CopyDirectory(dir, cdir, True)
            Else
                My.Computer.FileSystem.CopyDirectory(dir, cdir, True)
            End If
        Next

        ' 候補者ごとの投票数を取得する
        For Each row As DataSet1.選挙MRow In ds.選挙M
            Fill集計結果報告書TBy選挙ID(row.選挙ID.TrimEnd, ds)
        Next

        ' エクセルをサーバのTempフォルダに作成
        Dim saveFilePath As String = MyProperty.TEMPフォルダパス + CON_EXCEL_NAME + DateTime.Now.ToString("yyyyMMddHHmmss") + MyConstant.TEMPエクセル拡張子
        Dim baseFilePath As String = MyProperty.EXCELテンプレートフォルダパス + CON_EXCEL_NAME + MyConstant.エクセル拡張子

        ' Hashimoto
        If Chk_O1.Checked Then
            Using myExcel As MyExcel = New MyExcel()
                myExcel.Output集計結果報告書(saveFilePath, baseFilePath, ds, votePlaceText)
            End Using
        ElseIf Chk_O2.Checked Then
            Using myExcel As MyExcel = New MyExcel()
                myExcel.Output集計結果報告書_候補者ID順(saveFilePath, baseFilePath, ds, votePlaceText)
            End Using
        End If

        '読込みが終わったらreadフォルダを履歴フォルダに退避_Hashimoto
        Dim bdir As String
        bdir = MyProperty.システムＭ.投票フォルダパス + "BAK"
        Dim esdir As String
        Dim time As String
        time = DateTime.Now.ToString("yyyyMMddHHmmss")
        esdir = bdir + "\" + "履歴" + time
        My.Computer.FileSystem.MoveDirectory(MyProperty.システムＭ.投票フォルダパス + "read", esdir, True)

        '' エクセルをクライアントにダウンロード
        'DownloadExcel(saveFilePath)

        If Chk_Csv.Checked = True Then
            ExportReportKohoCsv(ds.集計結果報告書T)
            Exit Sub
        End If

        ' HTTPヘッダー情報設定
        Dim fileName As String = MyProperty.システムＭ.選挙コード
        If Not ChkAll.Checked Then
            'fileName += MyProperty.システムＭ.投票所コード
            fileName += votePlaceValue
        Else
            fileName += MyConstant.全投票所コード
        End If
        fileName += CON_EXCEL_NAME + DateTime.Now.ToString("yyyyMMddHHmm")

        '----- ダウンロードファイル情報をセッションに保存 
        Session.Remove("Xls_DownLoad_FilePath")
        Session.Remove("Xls_DownLoad_FileName")
        Session.Add("Xls_DownLoad_FilePath", saveFilePath)
        Session.Add("Xls_DownLoad_FileName", fileName)

        '----- ダウンロードページ呼出し 
        Dim sScript As String = "InsertIFrameDownloadPage('XlsDownloadPage.aspx');"
        ClientScript.RegisterStartupScript(Me.GetType(), "key", sScript, True)

    End Sub

    Private Sub Fill集計結果報告書TBy選挙ID(ByVal senkyoId As String, ByVal ds As DataSet1)

        ' 候補者マスタを取得する。
        Using myDataBase As MyDataBase = New MyDataBase
            myDataBase.Fill候補者MBy選挙ID(ds, senkyoId)
        End Using

        ' 白票データを付け足す
        ds.候補者M.Add候補者MRow(senkyoId, MyConstant.白票ID, MyConstant.白票名称, "", "", 1, 999, "", "", 0, "", "", "", "", "")

        Dim wFiles() As System.IO.FileInfo = Nothing

        Dim cnt As Integer = 0
        Dim i As Integer
        i = 0

        '投票ファイルフォルダを取得()
        Dim dir As String = MyProperty.システムＭ.投票フォルダパス + MyProperty.システムＭ.選挙コード + "\"
        dir += senkyoId + "\"

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

        Dim di As DirectoryInfo
        If ChkAll.Checked Then
            di = New DirectoryInfo(dir)
        Else
            di = New DirectoryInfo(cdir)
        End If

        Dim files() As FileInfo = di.GetFiles("*", IO.SearchOption.AllDirectories)
        Dim vals(2, 0) As String

        '1ファイルずつ開いて中身を調べる
        For Each file As FileInfo In files

            Using sr As StreamReader = New StreamReader(file.FullName)
                While (sr.Peek() >= 0)
                    ' ファイルを1行ずつ読み込む

                    ReDim Preserve vals(2, i)
                    vals(0, i) = sr.ReadLine()
                    vals(1, i) = sr.ReadLine()
                    vals(2, i) = sr.ReadLine()
                    i += 1
                End While
            End Using

        Next

        ' 各候補者の得票数を取得
        Using myFileIO As MyFile = New MyFile
            For Each row As DataSet1.候補者MRow In ds.候補者M

                'Dim cnt As Integer = Count投票数By候補者ID(senkyoId, row.候補者ID.TrimEnd, ChkAll.Checked, wFiles)

                i = 0
                cnt = 0
                For Each file As FileInfo In files

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

                'cnt = myFileIO.Count投票数By候補者ID(senkyoId, row.候補者ID.TrimEnd, ChkAll.Checked)
                'cnt = myFileIO.Count投票数By候補者ID(senkyoId, row.候補者ID.TrimEnd, ChkAll.Checked, wFiles)
                'Dim kohoId As String = row.候補者ID.TrimEnd

                ''進捗バーの表示
                'PnlProgress.Visible = True
                'Dim i As Integer
                'For i = 1 To wFiles.Count
                '    PnlProgress.Width = i
                'Next
                ds.集計結果報告書T.Add集計結果報告書TRow(senkyoId, row.候補者ID, row.候補者名称, cnt, row.政党ID)
                Debug.WriteLine(String.Concat("選挙ID:", senkyoId, ",候補者ID:", row.候補者ID, ",候補者名:", row.候補者名称, ",投票数:", cnt))
            Next
        End Using
        MyLog.captureLog(Application, wFiles)

    End Sub

    'Private Sub DownloadExcel(ByVal filePath As String)
    '    ' Responseクリア
    '    Response.Clear()
    '    ' HTTPヘッダー情報設定
    '    Dim fileName As String = MyProperty.システムＭ.選挙コード
    '    If Not ChkAll.Checked Then
    '        fileName += MyProperty.システムＭ.投票所コード
    '    End If
    '    fileName += CON_EXCEL_NAME + DateTime.Now.ToString("yyyyMMddHHmm") + MyConstant.エクセル拡張子
    '    Response.AppendHeader("Content-Disposition", "Attachment; filename*=utf-8''" + Server.UrlEncode(fileName))
    '    Response.ContentType = "application/msexcel"
    '    ' ファイル書込
    '    Response.WriteFile(filePath)
    '    ' レスポンス終了
    '    Response.End()
    'End Sub


    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="senkyoId"></param>
    ''' <param name="kohoId"></param>
    ''' <param name="isAll"></param>
    ''' <param name="pFiles"></param>
    ''' <returns>投票数</returns>
    ''' <remarks></remarks>
    Private 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

        '投票ファイルフォルダを取得()
        Dim dir As String = MyProperty.システムＭ.投票フォルダパス + MyProperty.システムＭ.選挙コード + "\"
        dir += senkyoId + "\"

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

        Dim di As DirectoryInfo
        If isAll Then
            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

    ''' <summary>
    ''' テキストファイルをカウント
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetFileCount() As Integer

        ' 選挙Mを取得する
        Dim ds As DataSet1 = New DataSet1
        Using myDataBase As MyDataBase = New MyDataBase
            myDataBase.Fill選挙M(ds)
        End Using

        Dim dir As String = String.Empty
        Dim wArr As New ArrayList

        If ChkAll.Checked Then

            '全投票所フォルダを集計対象とするにチェックが入っていた場合
            dir = MyProperty.システムＭ.投票フォルダパス + MyProperty.システムＭ.選挙コード + "\"
            GetAllFiles(dir, wArr)

        Else

            For Each sID As DataSet1.選挙MRow In ds.選挙M

                dir = MyProperty.システムＭ.投票フォルダパス + MyProperty.システムＭ.選挙コード + "\"
                'dir += sID.選挙ID.TrimEnd + "\" + MyProperty.システムＭ.投票所コード + "\"
                dir += sID.選挙ID.TrimEnd + "\" + Session(MyConstant.SessionKey.投票所コード) + "\"
                GetAllFiles(dir, wArr)

            Next

        End If

        Return wArr.Count * 3

    End Function
    ''' <summary>
    ''' 指定したフォルダの全てのファイルを取得
    ''' </summary>
    ''' <param name="pFolder"></param>
    ''' <param name="pArrFiles"></param>
    ''' <remarks></remarks>
    Private Sub GetAllFiles(ByVal pFolder As String, ByRef pArrFiles As ArrayList)

        'ファイルがなければ、ここで処理を追える
        If pArrFiles.Count.Equals(0) Then Return

        '指定されたフォルダのファイルを取得する
        Dim wArrFiles As String() = System.IO.Directory.GetFiles(pFolder, "*.txt")

        pArrFiles.AddRange(wArrFiles)

        'サブフォルダを取得する
        Dim wArrSub As String() = System.IO.Directory.GetDirectories(pFolder)

        'サブフォルダにあるファイルも調べる
        Dim wDir As String = String.Empty

        For Each wDir In wArrSub
            GetAllFiles(wDir, pArrFiles)
        Next wDir

    End Sub

    ''' <summary>
    ''' CSV出力
    ''' </summary>
    ''' <param name="dt"></param>
    ''' <remarks></remarks>
    Private Sub ExportReportKohoCsv(dt As DataTable)

        ' 出力列を指定
        Dim cols As String() = {"候補者ID", "候補者名称", "投票数", "政党ID"}

        ' 並び替え
        Dim sortedDt As DataTable
        Dim dv As New DataView(dt)

        Select Case True
            Case Chk_O1.Checked
                dv.Sort = "投票数 DESC"
            Case Chk_O2.Checked
                dv.Sort = "候補者ID ASC"
            Case Else
        End Select
        sortedDt = dv.ToTable()

        ' 白票を最終行に移動
        Dim targetRow As DataRow = sortedDt.AsEnumerable().FirstOrDefault(Function(r) r.Field(Of String)("候補者ID") = "blank")

        If targetRow IsNot Nothing Then
            Dim newRow As DataRow = sortedDt.NewRow()
            newRow.ItemArray = targetRow.ItemArray.Clone()
            newRow("候補者ID") = String.Empty
            sortedDt.Rows.Remove(targetRow)
            sortedDt.Rows.Add(newRow)
        End If

        ' CSV出力
        MyExportUtility.ExportCsv(sortedDt, cols, "output.csv", Response)

    End Sub

End Class