Imports System.Data
Imports System.IO
Imports AppVariable
Imports AppVariable_QA
Imports AppCommon
Imports AppQA

Partial Class faculty_QANew
    Inherits System.Web.UI.Page

#Region "************************* 定数 *************************"
    Protected MaxFileSize As Integer 'ファイルサイズ上限
    Protected MaxFileSizeInMB As Integer
#End Region

#Region "******************** ページイベント ********************"
    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        If IsPostBack = False Then
            DeleteTempFile() '添付ファイルクリア
            ChangeCtrl("Edit", isClear:=True)

            'タイトルバーの差し替え　文言変更
            Dim defaultTitleBar As UserControl = DirectCast(Master.FindControl("uc_TitleBar_big"), UserControl)
            If defaultTitleBar IsNot Nothing Then
                defaultTitleBar.Visible = False
            End If

            'ファイル名禁止文字チェック用に出力 20250714 S.Iguchi
            hf_禁止文字リスト.Value = Set禁止文字リスト()

            '確認ダイアログをハンドル
            btn_キャンセル.Attributes("onclick") = "return Dialog_YN(""入力したお問い合わせ内容はすべてクリアされます。よろしいですか？"")"
            btn_送信.Attributes("onclick") = "return Dialog_YN(""お問い合わせを事務局へ送信します。よろしいですか？"")"
        End If
    End Sub

#End Region

#Region "***************** コントロールイベント *****************"

    Protected Sub btn_参照_Click(sender As Object, e As EventArgs) Handles btn_参照.Click
        'ユーザコントロールを開く
        Com_UC1_Visible("slideopen")
    End Sub

    Protected Sub btn_宛先削除_Click(sender As Object, e As EventArgs)

        For Each grvRow In gv_宛先.Rows

            'Dim chk As CheckBox = CType(grvRow.Cells(0).FindControl("chk_削除対象"), CheckBox)

            'If chk.Checked = True Then

            Dim strTo区分 As String = CType(grvRow.FindControl("lbl_To区分"), Label).Text
            Dim strTo履修年度 As String = CType(grvRow.Cells(0).FindControl("lbl_To履修年度"), Label).Text
            Dim strTo成績年度 As String = CType(grvRow.Cells(0).FindControl("lbl_To成績年度"), Label).Text
            Dim strTo分野CD As String = CType(grvRow.Cells(0).FindControl("lbl_To分野CD"), Label).Text
            Dim strTo科目CD As String = CType(grvRow.Cells(0).FindControl("lbl_To科目CD"), Label).Text
            Dim strTo講座CD As String = CType(grvRow.Cells(0).FindControl("lbl_To講座CD"), Label).Text

            'TMP宛先から削除
            AppQA.宛先削除(strTo区分:=strTo区分,
                          strTo履修年度:=strTo履修年度,
                          strTo成績年度:=strTo成績年度,
                          strTo分野CD:=strTo分野CD,
                          strTo科目CD:=strTo科目CD,
                          strTo講座CD:=strTo講座CD,
                          str処理区分:="個別")
            'End If
        Next

        gv_宛先.DataBind()
        btn_宛先削除.Visible = IIf(gv_宛先.Rows.Count > 0, True, False)

    End Sub

    Protected Sub sql_宛先_Init(sender As Object, e As EventArgs) Handles sql_宛先.Init
        sql_宛先_select()
    End Sub

    Protected Sub gv_宛先_DataBound(sender As Object, e As EventArgs) Handles gv_宛先.DataBound
        lbl_宛先件数.Text = "(送信対象" & gv_宛先.Rows.Count.ToString & "件)"
    End Sub

    Protected Sub gv_宛先_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles gv_宛先.RowDataBound
    End Sub

    Protected Sub btn_FileDelete_Click(sender As Object, e As EventArgs) Handles btnFileDelete.Click
        '一時保存ファイルを削除
        DeleteTempFile()

        'トークンのクリア
        ViewState("UploadToken") = String.Empty
        '入力内容確認モードに変換
        ChangeCtrl("Edit")
    End Sub

    Protected Sub btn_入力確認_Click(sender As Object, e As EventArgs) Handles btn_入力確認.Click

        If 必須入力チェック("Edit") <> "" Then
            lbl_error.Text = 必須入力チェック("Edit")
            Exit Sub
        End If

        lbl_error.Text = ""

        '入力内容確認モードに変換
        ChangeCtrl("Confirm")
    End Sub

    Protected Sub btn_修正_Click(sender As Object, e As EventArgs) Handles btn_修正.Click
        '編集モードに変換
        ChangeCtrl("Edit")
    End Sub

    Protected Sub btn_キャンセル_Click(sender As Object, e As EventArgs) Handles btn_キャンセル.Click
        '一時保存ファイルを削除
        DeleteTempFile()
        '入力内容確認モードに変換
        ChangeCtrl("Edit", isClear:=True)
    End Sub

    Protected Sub btn_送信_Click(sender As Object, e As EventArgs) Handles btn_送信.Click

        Dim fileId = ""

        If 必須入力チェック("Confirm") <> "" Then
            lbl_error.Text = 必須入力チェック("Confirm")
            Exit Sub
        End If

        '添付ファイルチェック
        Try
            If Session(S_QA_Uploaded_File_ID) IsNot Nothing Then
                ViewState("fileName") = Session(S_QA_Uploaded_File_Name).ToString()
                fileId = UploadFileAndGetFileId()
            End If
        Catch ex As Exception
            Exit Sub
        End Try


        lbl_error.Text = ""

        '宛先数分、問合せ登録
        If gv_宛先.Rows.Count > 0 Then

            For Each r In gv_宛先.Rows

                Dim trainingKeys As TrainingParam = New TrainingParam()
                trainingKeys.履修年度 = CType(r.FindControl("lbl_To履修年度"), Label).Text
                trainingKeys.成績年度 = CType(r.FindControl("lbl_To成績年度"), Label).Text
                trainingKeys.分野CD = CType(r.FindControl("lbl_To分野CD"), Label).Text
                trainingKeys.科目CD = CType(r.FindControl("lbl_To科目CD"), Label).Text
                trainingKeys.講座CD = CType(r.FindControl("lbl_To講座CD"), Label).Text

                Dim str問合せ先CD = ""

                For i As Integer = 1 To 2
                    Dim To教職員ID As String = CType(r.FindControl(String.Format("lbl_To教職員ID0{0}", i)), Label).Text

                    If To教職員ID IsNot "" Then
                        If i = 2 Then
                            str問合せ先CD += "/" + To教職員ID '複数送信先がある場合は、スラッシュ区切りでDBに登録
                        Else
                            str問合せ先CD += To教職員ID
                        End If
                    End If
                Next
                QAInsert(trainingKeys, str問合せ先CD, fileId)
            Next
        End If

        Dim strTime As String = DateTime.Now.ToString("yyyy年M月d日 HH:mm")

        Dim str案内MSG = QA_Guidance_Message.Replace(vbCrLf, "\n")

        Dim strScript As String = "alert('" & strTime & " " & str案内MSG & "');"

        ScriptManager.RegisterStartupScript(Page, Page.GetType(), Guid.NewGuid().GetHashCode().ToString, strScript, True)

        pnl_入力確認.Visible = False
        tr_btnArea.Visible = False
        btn_履歴.Visible = True

        If ViewState("fileName") IsNot Nothing Then
            lbl_添付ファイル.Text = ViewState("fileName").ToString()
        End If

    End Sub

    Protected Sub btn_履歴_Click(sender As Object, e As EventArgs) Handles btn_履歴.Click
        DeleteTempFile()
        '一覧画面に戻る
        Response.Redirect(Com_Get_Content("menu_kj_qa01"))
    End Sub
    Protected Sub btnUpload_Click(sender As Object, e As EventArgs) Handles btnUpload.Click

        'すでにアップ済の場合は、アップ済のファイルを削除
        If fu_問合せ資料.HasFile Then
            ViewState("UploadToken") = String.Empty
            DeleteTempFile()
        End If

        Try
            ' 重複送信を防止するためのトークンを使用
            If ViewState("UploadToken") IsNot Nothing AndAlso ViewState("UploadToken").ToString() = "Uploaded" Then
                Exit Sub
            End If

            TempUploadFile(fu_問合せ資料)
            lbl_添付ファイル.Text = fu_問合せ資料.FileName

            If fu_問合せ資料.HasFile Then
                btnFileDelete.Visible = True
            End If

            ' トークンを設定して二重送信を防止
            ViewState("UploadToken") = "Uploaded"
        Catch ex As Exception
            lbl_error.Text = "ファイルのアップロードに失敗しました"
        End Try
    End Sub
#End Region

#Region "******************* Sub及びFunction ********************"

    Private Sub ChangeCtrl(ByVal strMode As String,
                           Optional ByVal isClear As Boolean = False)

        If isClear Then
            txt_件名.Text = ""
            txt_問い合わせ内容.Text = ""
            lbl_添付ファイル.Text = "選択されていません"
            btnFileDelete.Visible = False
            Clear宛先()
            Session.Remove(S_QA_Uploaded_File_ID)
            Session.Remove(S_QA_Uploaded_File_Path)
            Session.Remove(S_QA_Uploaded_File_Name)
        End If
        '入力した内容をラベルに設定
        lbl_件名.Text = txt_件名.Text
        lbl_問い合わせ内容.Text = txt_問い合わせ内容.Text.Replace(vbCrLf, "<br />")

        '編集モード
        If strMode = "Edit" Then
            txt_件名.Visible = True
            lbl_件名.Visible = False
            txt_問い合わせ内容.Visible = True
            lbl_問い合わせ内容.Visible = False
            btnCustomUpload.Visible = True
            btnFileDelete.Visible = fu_問合せ資料.HasFile '添付ありのときは削除ボタンを表示
            btn_参照.Visible = True
            btn_入力確認.Visible = True
            pnl_入力確認.Visible = False
            btn_履歴.Visible = True

            btn_宛先削除.Visible = IIf(gv_宛先.Rows.Count > 0, True, False)
            If gv_宛先.Rows.Count > 0 Then
                '編集モードの場合、チェックボックス列を表示
                gv_宛先.HeaderRow.Cells(0).Visible = True
                For idx As Integer = 0 To gv_宛先.Rows.Count - 1
                    gv_宛先.Rows(idx).Cells(0).Visible = True
                Next
                btn_宛先削除.Visible = True
            End If

            If Session(S_QA_Uploaded_File_Name) IsNot Nothing Then
                lbl_添付ファイル.Text = Session(S_QA_Uploaded_File_Name).ToString()
            Else
                lbl_添付ファイル.Text = "選択されていません"
            End If

        End If

        '入力内容確認モード
        If strMode = "Confirm" Then
            'Com_UC1_Visible("close")
            btn_参照.Visible = False
            If gv_宛先.Rows.Count > 0 Then
                '確認モードの場合、チェックボックス列を非表示
                gv_宛先.HeaderRow.Cells(0).Visible = False
                For idx As Integer = 0 To gv_宛先.Rows.Count - 1
                    gv_宛先.Rows(idx).Cells(0).Visible = False
                Next
            End If
            txt_件名.Visible = False
            lbl_件名.Visible = True
            txt_問い合わせ内容.Visible = False
            lbl_問い合わせ内容.Visible = True
            btnCustomUpload.Visible = False
            btnFileDelete.Visible = False
            btn_宛先削除.Visible = False
            pnl_入力確認.Visible = True
            btn_入力確認.Visible = False
            If Session(S_QA_Uploaded_File_Name) IsNot Nothing Then
                lbl_添付ファイル.Text = Session(S_QA_Uploaded_File_Name).ToString()
            Else
                lbl_添付ファイル.Text = "なし"
            End If
        End If
    End Sub


    Private Function 必須入力チェック(ByVal strMode As String) As String
        Dim strErrorMsg As String = ""

        If strMode = "Edit" Then
            If gv_宛先.Rows.Count = 0 Then
                strErrorMsg = "宛先の研修を選択してください。"
                Return strErrorMsg
            End If
            If txt_問い合わせ内容.Text.Trim.Length = 0 Then
                strErrorMsg = "必須項目が入力されていません。"
                Return strErrorMsg
            End If
            If txt_件名.Text.Trim.Length > 200 Then
                strErrorMsg = "件名は200文字以内で入力してください。"
                Return strErrorMsg
            End If
            If txt_問い合わせ内容.Text.Trim.Length > 1073741824 Then
                strErrorMsg = "入力データが許可された最大長を超えています。"
                Return strErrorMsg
            End If
            If fu_問合せ資料.PostedFile.ContentLength > ConfigSettings.MaxFileSize Then
                strErrorMsg = "ファイルサイズが大きすぎます。" _
                            & ConfigSettings.MaxFileSizeInMB & "MB以下のファイルを選択してください。"
                Return strErrorMsg
            End If
        ElseIf strMode = "Confirm" Then
            If lbl_問い合わせ内容.Text.Trim.Length = 0 Then
                strErrorMsg = "必須項目が入力されていません。"
                Return strErrorMsg
            End If
            If txt_件名.Text.Trim.Length > 200 Then
                strErrorMsg = "件名は200文字以内で入力してください。"
                Return strErrorMsg
            End If
        End If

        Return strErrorMsg
    End Function

    Private Sub sql_宛先_select()

        Dim sds As SqlDataSource = sql_宛先
        WebControlsUtil.DeclareSP(sds, "QA_TMP問合せ宛先_SELECT")
        With sds
            .SelectParameters.Add("PORTALID", DbType.String, Session(S_COM_PortalID))
        End With

    End Sub

    Private Sub Clear宛先()

        If gv_宛先.Rows.Count > 0 Then

            For Each grvRow In gv_宛先.Rows

                Dim chk As CheckBox = CType(grvRow.Cells(0).FindControl("chk_削除対象"), CheckBox)

                Dim strTo区分 As String = CType(grvRow.FindControl("lbl_To区分"), Label).Text
                Dim strTo履修年度 As String = CType(grvRow.Cells(0).FindControl("lbl_To履修年度"), Label).Text
                Dim strTo成績年度 As String = CType(grvRow.Cells(0).FindControl("lbl_To成績年度"), Label).Text
                Dim strTo分野CD As String = CType(grvRow.Cells(0).FindControl("lbl_To分野CD"), Label).Text
                Dim strTo科目CD As String = CType(grvRow.Cells(0).FindControl("lbl_To科目CD"), Label).Text
                Dim strTo講座CD As String = CType(grvRow.Cells(0).FindControl("lbl_To講座CD"), Label).Text

                'TMP宛先から削除
                AppQA.宛先削除(strTo区分:=strTo区分,
                      strTo履修年度:=strTo履修年度,
                      strTo成績年度:=strTo成績年度,
                      strTo分野CD:=strTo分野CD,
                      strTo科目CD:=strTo科目CD,
                      strTo講座CD:=strTo講座CD,
                      str処理区分:="個別")
            Next
        End If

        gv_宛先.DataBind()
        '宛先削除ボタンを非表示化
        btn_宛先削除.Visible = False
    End Sub



    Private Sub TempUploadFile(fu As FileUpload)

        If fu.HasFile Then

            Dim fileId As String = Guid.NewGuid().ToString()
            Dim tempPath As String = GetTempFolderPath()
            Dim tempFileName As String = Path.Combine(tempPath, fileId & Path.GetExtension(fu.FileName))
            Dim orgFileName As String = fu.FileName

            '一時フォルダに保存
            Try
                fu.SaveAs(tempFileName)

                '確認後アップ時
                Session(S_QA_Uploaded_File_ID) = fileId
                Session(S_QA_Uploaded_File_Path) = tempFileName
                Session(S_QA_Uploaded_File_Name) = orgFileName
            Catch

            End Try
        End If

    End Sub


    Private Function UploadFileAndGetFileId() As String
        Dim tempFilePath As String = Session(S_QA_Uploaded_File_Path).ToString()
        Dim fileId As String = Session(S_QA_Uploaded_File_ID).ToString()
        Dim orgFileName As String = lbl_添付ファイル.Text '元ファイル名

        If String.IsNullOrEmpty(tempFilePath) Or String.IsNullOrEmpty(fileId) Then
            Return String.Empty
        End If

        Dim rootPath As String = GetFileFolderPath()

        Try
            If rootPath.StartsWith("http://") OrElse rootPath.StartsWith("https://") Then
                ' リモートサーバーへのアップロード
                Dim permanentUrl = AppQA.CombineUrlPaths(rootPath, Path.GetFileName(tempFilePath))
                AppQA.UploadFileToRemoteServer(tempFilePath, permanentUrl)

                ' DBに添付ファイル情報を登録
                AppQA.問合せ添付追加(fileId, orgFileName, permanentUrl)
            Else
                ' ローカルファイルの移動
                If Not File.Exists(tempFilePath) Then
                    Throw New FileNotFoundException("一時ファイルが見つかりません。", tempFilePath)
                End If

                rootPath = If(rootPath.Last() = Path.DirectorySeparatorChar, rootPath, rootPath & Path.DirectorySeparatorChar)
                Dim permanentPath = Path.Combine(rootPath, Path.GetFileName(tempFilePath))

                File.Move(tempFilePath, permanentPath)

                ' DBに添付ファイル情報を登録
                AppQA.問合せ添付追加(fileId, orgFileName, permanentPath)
            End If

            ' 一時ファイルの削除
            DeleteTempFile()

            Return fileId
        Catch ex As Exception
            Return String.Empty
        End Try
    End Function

    Private Sub DeleteTempFile()

        If Session(S_QA_Uploaded_File_Path) Is Nothing Then
            Return
        End If

        Dim tempFilePath As String = Session(S_QA_Uploaded_File_Path).ToString()

        If File.Exists(tempFilePath) Then
            '一時ファイルの削除
            File.Delete(tempFilePath)
            Session.Remove(S_QA_Uploaded_File_ID)
            Session.Remove(S_QA_Uploaded_File_Path)  ' Clean up the session variable
            Session.Remove(S_QA_Uploaded_File_Name)
        End If
        lbl_添付ファイル.Text = "選択されていません"

    End Sub
#End Region
    Private Sub QAInsert(trainingKeys As TrainingParam,
                      教職員ID As String,
                       fileId As String)
        Dim portalKbn = Session(S_COM_PortalKbn).ToString()
        Dim userCd = Session(S_COM_UserCD).ToString()
        Dim str件名 = lbl_件名.Text
        Dim str問合せ先区分 = "職員"
        Dim userInfo As LoginUser = Session(S_COM_LoginUser)
        '問い合わせ内容保存
        Dim intNew問合せID As Integer = 0

        intNew問合せID = AppQA.新規問合せ登録(str登録者区分:=portalKbn,
                     str登録者CD:=userCd,
                     strTo履修年度:=trainingKeys.履修年度,
                     strTo成績年度:=trainingKeys.成績年度,
                     strTo分野CD:=trainingKeys.分野CD,
                     strTo科目CD:=trainingKeys.科目CD,
                     strTo講座CD:=trainingKeys.講座CD,
                     str件名:=str件名,
                     str問合せ内容:=lbl_問い合わせ内容.Text.Replace("<br />", vbCrLf),
                     str問合せ先区分:="職員",
                     str問合せ先CD:=教職員ID,
                     fileId:=fileId)
        '成功登録の場合
        If intNew問合せID > 0 Then

            'TMP宛先から削除
            AppQA.宛先削除(strTo区分:="研修",
                      strTo履修年度:=trainingKeys.履修年度,
                      strTo成績年度:=trainingKeys.成績年度,
                      strTo分野CD:=trainingKeys.分野CD,
                      strTo科目CD:=trainingKeys.科目CD,
                      strTo講座CD:=trainingKeys.講座CD,
                      str処理区分:="個別")

            Dim str掲示種別CD As String = AppInfo.GetInfoKindCd("問い合わせ")

            '職員への掲示を登録
            '--掲示種別CD(05:問合せ関連)
            AppInfo.掲示登録(str掲示種別CD,
                             "お問合せ" & IIf(str件名.Trim.Length > 0, "(" & str件名 & ")", ""),
                             Nothing,
                             "(" & portalKbn & ")" & userInfo.USERNAME,
                             DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                             Nothing,
                             "重要",
                             userInfo.USERCD,
                             "教職員所属/職員",
                             "教職員所属",
                             "/faculty/QADetail.aspx",
                             "menu_kj_qa02",
                             intNew問合せID.ToString
                             )
            '掲示板通知メールの送信
            Dim mailSucFlg = AppMail.SendQABoardInfoMails(loginUserInfo:=userInfo, qaId:=intNew問合せID.ToString(), subject:=str件名,
                                                  toUserCds:=教職員ID)
        End If
    End Sub
End Class
