Imports System.Data
Imports System.IO
Imports AppVariable
Imports AppVariable_QA
Imports AppCommon
Imports System.Net
Imports System.Web

Partial Class student_QANew
    Inherits System.Web.UI.Page

#Region "************************* 定数 *************************"
    Private _param As TrainingParam
    Private Const S_QA_Staff_CD_01 = "S_QA_Staff_CD_01"
    Private Const S_QA_Staff_CD_02 = "S_QA_Staff_CD_02"
    Private Const S_QA_Training_Name = "S_QA_Training_Name"
    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 Session(S_QA_Uploaded_File_Name) IsNot Nothing Then
            lbl_添付ファイル.Text = Session(S_QA_Uploaded_File_Name).ToString
        End If

        If IsPostBack = False Then

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

            'セッション切れでリダイレクト(エラー回避)
            If Session(S_COM_UserCD) Is Nothing Then
                Response.Redirect(Request.ApplicationPath & Logout_FilePath)
            End If

            '研修情報の取得
            Dim dt As DataTable = AppQA.Get申込詳細(Session(S_COM_UserCD))

            _param = New TrainingParam
            _param.履修年度 = dt.Rows(0)("履修年度").ToString
            _param.成績年度 = dt.Rows(0)("成績年度").ToString
            _param.分野CD = dt.Rows(0)("分野CD").ToString
            _param.科目CD = dt.Rows(0)("科目CD").ToString
            _param.講座CD = dt.Rows(0)("講座CD").ToString
            _param.連番 = dt.Rows(0)("連番").ToString
            Session(S_Training_Seleted_Param) = _param
            Session(S_QA_Training_Name) = dt.Rows(0)("回名").ToString
            Session(S_QA_Staff_CD_01) = dt.Rows(0)("教職員ID01").ToString
            Session(S_QA_Staff_CD_02) = dt.Rows(0)("教職員ID02").ToString
            Session(S_QA_Organization_Staff_ID) = dt.Rows(0)("自治体職員ID").ToString
            DeleteTempFile() '添付ファイルクリア

            '研修名の表示
            lbl_研修名.Text = Session(S_QA_Training_Name).ToString()
            lbl_教職員ID01.Text = Session(S_QA_Staff_CD_01).ToString()
            lbl_教職員ID02.Text = Session(S_QA_Staff_CD_02).ToString()

            ChangeCtrl("Edit")

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


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

#End Region

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

    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 As String = ""
        _param = Session(S_Training_Seleted_Param)

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

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


        lbl_error.Text = ""

        Dim str問合せ先CD = ""
        Dim To教職員ID As String = lbl_教職員ID01.Text
        Dim 自治体職員ID As String = Session(S_QA_Organization_Staff_ID).ToString()

        If To教職員ID IsNot "" Then
            str問合せ先CD += To教職員ID
            If Not lbl_教職員ID02.Text = "" Then
                To教職員ID = lbl_教職員ID02.Text
                str問合せ先CD += "/" + To教職員ID '複数送信先がある場合は、スラッシュ区切りでDBに登録
            End If
        End If

        QAInsert(_param.履修年度, _param.成績年度, _param.分野CD, _param.科目CD, _param.講座CD, str問合せ先CD, fileId)

        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

    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 = "ファイルのアップロードに失敗しました"
            Exit Sub
        End Try
    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

#End Region

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

    Private Sub ChangeCtrl(strMode As String,
                           Optional isClear As Boolean = False)
        If isClear Then
            txt_件名.Text = ""
            txt_問い合わせ内容.Text = ""
            lbl_添付ファイル.Text = "選択されていません"
            btnFileDelete.Visible = False
            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
            pnl_入力確認.Visible = False
            btn_履歴.Visible = True

            If Session(S_QA_Uploaded_File_Name) IsNot Nothing Then

                lbl_添付ファイル.Text = Session(S_QA_Uploaded_File_Name).ToString()
                btnFileDelete.Visible = True

            Else
                lbl_添付ファイル.Text = "選択されていません"
            End If

        End If
        '入力内容確認モード
        If strMode = "Confirm" Then

            txt_件名.Visible = False
            lbl_件名.Visible = True
            txt_問い合わせ内容.Visible = False
            lbl_問い合わせ内容.Visible = True
            btnCustomUpload.Visible = False
            btnFileDelete.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 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 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)
            lbl_添付ファイル.Text = "選択されていません"
        End If

    End Sub


    Private Sub QAInsert(strTo履修年度 As String,
                   strTo成績年度 As String,
                   strTo分野CD As String,
                   strTo科目CD As String,
                   strTo講座CD As String,
                  教職員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 自治体職員ID As String = Session(S_QA_Organization_Staff_ID).ToString()
        Dim userInfo As LoginUser = Session(S_COM_LoginUser)

        '問い合わせ内容保存
        Dim intNew問合せID As Integer = 0

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

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

            '職員への掲示を登録
            '--掲示種別CD(12:問合せ関連)
            AppInfo.掲示登録(str掲示種別CD,
                             "お問合せ" & IIf(str件名.Trim.Length > 0, "(" & str件名 & ")", ""),
                             Nothing,
                             "(" & portalKbn & ")" & Session(S_COM_User_Name),
                             DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                             Nothing,
                             "重要",
                             userCd,
                             "教職員所属/職員",
                             "教職員所属",
                             "/faculty/QADetail.aspx",
                             "menu_kj_qa02",
                             intNew問合せID.ToString()
                             )

            '掲示板通知メールの送信
            Dim mailSucFlg = AppMail.SendQABoardInfoMails(loginUserInfo:=userInfo, qaId:=intNew問合せID, subject:=str件名,
                                                  toUserCds:=教職員ID)
            '問合せ閲覧通知メールの送信
            '学生からの問合せを自治体窓口に共有
            If portalKbn = "学生" Then
                mailSucFlg = AppMail.SendQAViewMail(loginUserInfo:=userInfo, qaId:=intNew問合せID.ToString(), toUserCd:=自治体職員ID)
            End If

        End If
    End Sub

#End Region

End Class
