using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Office.Interop;
using Microsoft.Office.Interop.Word;

namespace GoSoftCertificados
{
    public partial class certificados : System.Web.UI.Page
    {
        //Diretório Padrão dos Manuais do Sistema
        public string DirPath = "C:\\Users\\tague_dev\\Documents\\Visual Studio 2015\\Projects\\GoSoftCertificados\\GoSoftCertificados\\arquivos\\";

        protected void Page_Load(object sender, EventArgs e)
        {
            //Carrega as Sessions do Sistema
            Session["CNPJ"] = "14.083.055/0001-17";
            Session["NOMEPARTICIPANTE"] = "Gabriela Evangelista";
            Session["DESCRICAO"] = "Workshop XYZ - Funcionalidades do Sistema - Treinamento de Faturamento";
            Session["DATAREALIZACAO"] = "11/11/2016";
            Session["CARGAHORARIA"] = "4 Horas";
        }

        protected void btnOffice_Click(object sender, EventArgs e)
        {

            //Monta Diretório por cliente
            string CNPJParaPath = Session["CNPJ"].ToString().Replace(".", "").Replace("/", "").Replace("-", "");
            string DirPathCliente = DirPath + "clientes\\" + CNPJParaPath;

            //Cria o Diretório do Cliente caso não exista
            bool exists = System.IO.Directory.Exists(DirPathCliente);
            if (!exists)
                System.IO.Directory.CreateDirectory(DirPathCliente);

            //Define os nomes com caminhos completos
            string NomeManualOriginal = DirPath + rbList.SelectedValue.ToString() + ".doc";
            DateTime dataAgora = DateTime.Now;
            string strdataAgora = dataAgora.ToString("yyyyMMddHHmmss");
            string NomeManualNew = DirPathCliente + "\\" + rbList.SelectedValue.ToString() + strdataAgora + ".pdf";
            string UrlPath = HttpContext.Current.Request.Url.Authority + "/arquivos/clientes/" + CNPJParaPath + "/" + rbList.SelectedValue.ToString() + strdataAgora + ".pdf";


            //Inicia Processo de Geração do Arq Dinamico
            System.Diagnostics.Stopwatch oTempo = new System.Diagnostics.Stopwatch();
            try
            {
                //ATENÇÃO - APÓS IMPLANTAÇÃO COMENTAR TIMER
                oTempo.Start();
                ProcessManual(NomeManualOriginal, NomeManualNew, Session["NOMEPARTICIPANTE"].ToString(), Session["DESCRICAO"].ToString(), Session["DATAREALIZACAO"].ToString(), Session["CARGAHORARIA"].ToString());
                oTempo.Stop();
                Page.ClientScript.RegisterStartupScript(this.GetType(), "Tempo de Processamento", "alert('Tempo de Processamento: " + oTempo.Elapsed.TotalSeconds + " Segundos');", true);

                //Abre o Manual gerado na tela do usuário
                //Response.Redirect(UrlPath);
                Response.Write("<script>");
                Response.Write("window.open('" + UrlPath + "','_blank')");
                Response.Write("</script>");

            }
            catch (Exception ex)
            {
                //TRATAR MENSAGEM DE ERRO
            }
            finally
            {
                //lblMsg.Text = "Fim do Processamento";
            }


        }

        private static void ProcessManual(string NomeManualOriginal, string NomeManualNew, string strNomeParticipante, string strDescricao, string strDtRealizacao, string strCargaHoraria)
        {

            // Abrir Aplicacao Word
            Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();

            // Arquivo de Origem
            object filename = NomeManualOriginal;

            // Arquivo de Destino
            object newFileName = NomeManualNew;

            object missing = System.Type.Missing;

            // Abrir documento
            Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Open(ref filename, ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing);

            doc.Activate();


            /* VARIÁVEIS */
            searchAndReplaceInStory(doc, "#VARNPARTICIPANTE#", strNomeParticipante);
            searchAndReplaceInStory(doc, "#VARDESCRICAO#", strDescricao);
            searchAndReplaceInStory(doc, "#VARDTREALIZACAO#", strDtRealizacao);
            searchAndReplaceInStory(doc, "#VARCARGAHORARIA#", strCargaHoraria);
            
   
            // Formato para Salvar o Arquivo – Destino  – No caso, PDF
            object formatoArquivo = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF;

            // Alterações no tamanho do Papel – No caso, utilizando o formato A4
            doc.PageSetup.PaperSize = Microsoft.Office.Interop.Word.WdPaperSize.wdPaperA4;

            // Alterações na Orientação do Papel
            //doc.PageSetup.Orientation = Microsoft.Office.Interop.Word.WdOrientation.wdOrientPortrait;
            doc.PageSetup.Orientation = Microsoft.Office.Interop.Word.WdOrientation.wdOrientLandscape;

            // Salvar Arquivo
            doc.SaveAs(ref newFileName, ref formatoArquivo, ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

            // Não salvar alterações no arquivo original
            object salvarAlteracoesArqOriginal = false;
            wordApp.Quit(ref salvarAlteracoesArqOriginal, ref missing, ref missing);
        }

        private static void searchAndReplaceInStory(Microsoft.Office.Interop.Word.Document wordDocument, string strSearch, string strReplace)
        {
            object missing = System.Type.Missing;

            foreach (Microsoft.Office.Interop.Word.Range tmpRange in wordDocument.StoryRanges)
            {
                string strtype = tmpRange.StoryType.ToString();
                tmpRange.Find.Text = strSearch;
                tmpRange.Find.Replacement.Text = strReplace;

                tmpRange.Find.Wrap = Microsoft.Office.Interop.Word.WdFindWrap.wdFindContinue;
                object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;

                tmpRange.Find.Execute(ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref replaceAll,
                    ref missing, ref missing, ref missing, ref missing);
            }
        }
    }
}