using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using AeBusinessLayer.ClassFiles;
using System.Xml.Xsl;
using System.Data.OleDb;
using System.Xml;
using System.IO;
using AeBusinessLayer;
using System.Xml.XPath;
using System.Xml.Schema;
using System.Threading;
public partial class InvoiceManagement_InvoicesCreated : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            btnCancelInvoice.Attributes.Add("onclick", "getConfirmationForDelete(‘" + this.hdnFlag.ClientID.ToString() + "’)");
            btnCancelRun.Attributes.Add("onclick", "getConfirmationForDelete(‘" + this.hdnFlag.ClientID.ToString() + "’)");
            btnExecuteRun.Attributes.Add("onclick", "getConfirmationForDelete(‘" + this.hdnFlag.ClientID.ToString() + "’)");
            btnCreateHTML.Attributes.Add("onclick", "getConfirmationForDelete(‘" + this.hdnFlag.ClientID.ToString() + "’)");
            btnCreateXml.Attributes.Add("onclick", "getConfirmationForDelete(‘" + this.hdnFlag.ClientID.ToString() + "’)");
            btnCreateInvoice.Attributes.Add("onclick", "getConfirmationForDelete(‘" + this.hdnFlag.ClientID.ToString() + "’)");
            AeSharedLibrary.clsSession.UserSession SessionStruct;
            SessionStruct = (AeSharedLibrary.clsSession.UserSession)Session["UserInformation"];
            AeBusinessLayer.ClassFiles.BatchSummary _batch = new AeBusinessLayer.ClassFiles.BatchSummary();
            DataSet _dsEmail = _batch.SelectToInvoiceDetails(SessionStruct.BillId);
            if (_dsEmail.Tables[0].Rows.Count > 0)
            {
                btnCancelInvoice.Visible = true;
                btnCreateInvoice.Visible = true;
                btnCreateXml.Visible = true;
                btnCreateHTML.Visible = true;
                btnCancelRun.Visible = true;
                gvInvoiceDetails.Visible = true;
                lblMessage.Visible = false;
                Panel8.Visible = true;
                Label1.Visible = true;
                chkBoxAlls.Visible = true;
                ViewState["EmailInvoice"] = _dsEmail.Tables[0];
                gvInvoiceDetails.DataSource = _dsEmail.Tables[0].DefaultView;
                gvInvoiceDetails.DataBind();
            }
            else
            {
                btnCancelInvoice.Visible = false;
                btnCreateInvoice.Visible = false;
                btnCreateXml.Visible = false;
                Label1.Visible = false;
                btnCreateHTML.Visible = false;
                btnCancelRun.Visible = false;
                chkBoxAlls.Visible = false;
                lblMessage.Visible = true;
                Panel8.Visible = false;
                lblMessage.Text = "Please Execute Run for creating invoices";
                gvInvoiceDetails.Visible = false;
            }
        }
    }
    protected void btnBack_Click(object sender, EventArgs e)
    {
        Server.Transfer("~/InvoiceManagement/BatchSummary.aspx");
    }
    protected void gvInvoiceDetails_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "InvoiceId")
        {
            LinkButton btn = (LinkButton)e.CommandSource;
            int TransId = Convert.ToInt32(btn.Text.ToString());
            SessionInfo(TransId, "~/InvoiceManagement/InvoicesCreated.aspx", "~/InvoiceManagement/TransactionDetails.aspx", string.Empty);
        }
    }
    protected void SessionInfo(int TransId, string PagePath, string NewPath, string MessageString)
    {
        AeSharedLibrary.clsSession.UserSession SessionStruct;
        SessionStruct = (AeSharedLibrary.clsSession.UserSession)Session["UserInformation"];
        SessionStruct.transId = TransId;
        SessionStruct.MessageString = MessageString;
        SessionStruct.PagePath = PagePath;
        Session["UserInformation"] = SessionStruct;
        Server.Transfer(NewPath);
    }
    protected void btnExecuteRun_Click(object sender, EventArgs e)
    {
        if (gvInvoiceDetails.Rows.Count == 0)
        {
            if (this.hdnFlag.Value == "OK")
            {
                AeSharedLibrary.clsSession.UserSession SessionStruct;
                SessionStruct = (AeSharedLibrary.clsSession.UserSession)Session["UserInformation"];
                int BillId = SessionStruct.BillId;
                //Add Confirmation Box here -Pawan
                AeBusinessLayer.ClassFiles.BatchSummary _batch = new AeBusinessLayer.ClassFiles.BatchSummary();
                _batch.ExecuteForBillRunToCreateInvoices(BillId);
                SessionInfo(0, "~/InvoiceManagement/InvoicesCreated.aspx", "~/Message/Message.aspx", "Execute run has been completed.");
            }
            else
            {
                //do not do anything.
            }
        }
        else if (gvInvoiceDetails.Rows.Count > 0)
        {
            if (this.hdnFlag.Value == "OK")
            {
                CheckBox chk;
                int Checked = 0;
                foreach (GridViewRow rowItem in gvInvoiceDetails.Rows)
                {
                    chk = (CheckBox)(rowItem.Cells[0].FindControl("chkBoxChild"));
                    if (chk.Checked == true)
                    {
                        Checked++;
                        int BillRunId = Convert.ToInt32(rowItem.Cells[1].Text.Trim().ToString());
                        AeBusinessLayer.ClassFiles.BatchSummary _batch = new AeBusinessLayer.ClassFiles.BatchSummary();
                        _batch.ExecuteForBillRunToCreateInvoices(BillRunId);
                    }
                }
                if (Checked == 0)
                {
                    AeSharedLibrary.clsMessage.Show("Select to Execute Bill Run");
                }
                else
                {
                    SessionInfo(0, "~/InvoiceManagement/InvoicesCreated.aspx", "~/Message/Message.aspx", "Execute run has been completed.");
                }
            }
            else
            {
                // do not do anything.
            }
        }
    }
    protected void btnCancelInvoice_Click(object sender, EventArgs e)
    {
        if (this.hdnFlag.Value == "OK")
        {
            CheckBox chk;
            int Checked = 0;
            foreach (GridViewRow rowItem in gvInvoiceDetails.Rows)
            {
                chk = (CheckBox)(rowItem.Cells[0].FindControl("chkBoxChild"));
                if (chk.Checked == true)
                {
                    Checked++;
                    LinkButton bill = (LinkButton)(rowItem.Cells[5].FindControl("lnkInvoice"));
                    int InvoiceId = Convert.ToInt32(bill.Text.Trim().ToString());
                    AeBusinessLayer.ClassFiles.BatchSummary _batch = new AeBusinessLayer.ClassFiles.BatchSummary();
                    _batch.CancelInvoices(InvoiceId);
                }
            }
            if (Checked == 0)
            {
                AeSharedLibrary.clsMessage.Show("Select to Cancel Invoice(s)");
            }
            else
            {
                SessionInfo(0, "~/InvoiceManagement/InvoicesCreated.aspx", "~/Message/Message.aspx", "Cancel Invoice has been completed.");
            }
        }
        else
        {
            //do not do anything
        }
    }
    protected void btnCancelRun_Click(object sender, EventArgs e)
    {
        if (this.hdnFlag.Value == "OK")
        {
            CheckBox chk;
            int Checked = 0;
            foreach (GridViewRow rowItem in gvInvoiceDetails.Rows)
            {
                chk = (CheckBox)(rowItem.Cells[0].FindControl("chkBoxChild"));
                if (chk.Checked == true)
                {
                    Checked++;
                    int billRunId = Convert.ToInt32(rowItem.Cells[1].Text.Trim().ToString());
                    AeBusinessLayer.ClassFiles.BatchSummary _batch = new AeBusinessLayer.ClassFiles.BatchSummary();
                    _batch.CancelBillRun(billRunId);
                }
            }
            if (Checked == 0)
            {
                AeSharedLibrary.clsMessage.Show("Select to Cancel bill run");
            }
            else
            {
                SessionInfo(0, "~/InvoiceManagement/InvoicesCreated.aspx", "~/Message/Message.aspx", "Cancel bill run has been completed.");
            }
        }
        else
        {
            // do not do anything
        }
    }
    protected void btnCreateInvoice_Click(object sender, EventArgs e)
    {
        if (this.hdnFlag.Value == "OK")
        {
            CheckBox chk;
            int Checked = 0;
            foreach (GridViewRow rowItem in gvInvoiceDetails.Rows)
            {
                chk = (CheckBox)(rowItem.Cells[0].FindControl("chkBoxChild"));
                if (chk.Checked == true)
                {
                    Checked++;
                    int billRunId = Convert.ToInt32(rowItem.Cells[1].Text.Trim().ToString());
                    string customerId = Convert.ToString(rowItem.Cells[4].Text.Trim().ToString());
                    int partnerid = Convert.ToInt32(rowItem.Cells[3].Text.Trim().ToString());
                    AeBusinessLayer.ClassFiles.BatchSummary _batch = new AeBusinessLayer.ClassFiles.BatchSummary();
                    _batch.CreateInvoice(billRunId, customerId, partnerid);
                }
            }
            if (Checked == 0)
            {
                AeSharedLibrary.clsMessage.Show("Select to Create Invoices");
            }
            else
            {
                SessionInfo(0, "~/InvoiceManagement/InvoicesCreated.aspx", "~/Message/Message.aspx", "Create Invoice(s) has been completed.");
            }
        }
        else
        {
            // do not do anything
        }
    }
    private void InsertHTMLStatus(int NoofHTMLstobeProcessed, int billRunId)
    {
        AeBusinessLayer.ClassFiles.BatchSummary _batch = new BatchSummary();
        int retValue = _batch.InsertInvoiceProcessStatusFORHTML(NoofHTMLstobeProcessed, billRunId);
        if (retValue == 1)
        {
            //AeSharedLibrary.clsMessage.Show("opps ……………………..");
        }
        else if (retValue == 0)
        {
            AeSharedLibrary.clsMessage.Show("Error has been occurred");
        }
    }
    private void InsertXMLStatus(int NoofXmlstobeProcessed, int billRunId)
    {
        AeBusinessLayer.ClassFiles.BatchSummary _batch = new BatchSummary();
        int retValue = _batch.InsertInvoiceProcessStatus(NoofXmlstobeProcessed, billRunId);
        if (retValue == 1)
        {
            //AeSharedLibrary.clsMessage.Show("opps ……………………..");
        }
        else if (retValue == 0)
        {
            AeSharedLibrary.clsMessage.Show("Error has been occurred");
        }
    }
    private void UpdateXMLStatus()
    {
        // Status ,  , XMLSProcessed , IsErrorForXML , ErrorForXML , XMLProcessStatus , ModifiedOn(getdate()) ,
        AeBusinessLayer.ClassFiles.BatchSummary _batch = new BatchSummary();
        DataSet dsInvoiceStatusId = _batch.SelectTopInvoiceStatusId();
        int Err;
        if (dsInvoiceStatusId.Tables[0].Rows.Count > 0)
        {
            int InvoiceProcessStatusId = Convert.ToInt32(dsInvoiceStatusId.Tables[0].Rows[0][0].ToString());
            int XMLSProcessed = Convert.ToInt32(dsInvoiceStatusId.Tables[0].Rows[0][1].ToString());
            int RetValue = _batch.UpdateInvoiceProcessStatus(InvoiceProcessStatusId, null, "Completed", 0, "Completed", 0, null);
            if (RetValue == 1)
            {
                //AeSharedLibrary.clsMessage.Show("opps ……………………..");
            }
            else if (RetValue == 0)
            {
                AeSharedLibrary.clsMessage.Show("Error has been occurred");
            }
        }
    }
    private void UpdateHTMLStatus()
    {
        AeBusinessLayer.ClassFiles.BatchSummary _batch = new BatchSummary();
        DataSet dsInvoiceStatusId = _batch.SelectTopInvoiceStatusId();
        int Err;
        if (dsInvoiceStatusId.Tables[0].Rows.Count > 0)
        {
            int InvoiceProcessStatusId = Convert.ToInt32(dsInvoiceStatusId.Tables[0].Rows[0][0].ToString());
            int XMLSProcessed = Convert.ToInt32(dsInvoiceStatusId.Tables[0].Rows[0][1].ToString());
            int RetValue = _batch.UpdateInvoiceProcessStatus(InvoiceProcessStatusId, null, "Completed", 0, "Completed", 0, null);
            if (RetValue == 1)
            {
                //AeSharedLibrary.clsMessage.Show("opps ……………………..");
            }
            else if (RetValue == 0)
            {
                AeSharedLibrary.clsMessage.Show("Error has been occurred");
            }
        }
    }
    protected void btnCreateXml_Click(object sender, EventArgs e)
    {
        AeBusinessLayer.ClassFiles.CreateXml _createXml = new AeBusinessLayer.ClassFiles.CreateXml();
        if (this.hdnFlag.Value == "OK")
        {
            CheckBox chk;
            int XMLStobeProcessed = 0;
            foreach (GridViewRow rowItem in gvInvoiceDetails.Rows)
            {
                chk = (CheckBox)(rowItem.Cells[0].FindControl("chkBoxChild"));
                if (chk.Checked == true)
                {
                    XMLStobeProcessed += 1;
                }
            }
            if (XMLStobeProcessed > 0)
            {
                int billRunId = Convert.ToInt32(gvInvoiceDetails.Rows[0].Cells[1].Text.Trim().ToString());
                InsertXMLStatus(XMLStobeProcessed, billRunId);
                AeBusinessLayer.ClassFiles.BatchSummary _batch = new BatchSummary();
                DataSet dsInvoiceStatusId = _batch.SelectTopInvoiceStatusId();
                int InvoiceProcessStatusId = Convert.ToInt32(dsInvoiceStatusId.Tables[0].Rows[0][0].ToString());
                Thread td = new Thread(new ThreadStart(NewThisTime));               
                td.IsBackground = true;
                td.Start();
                NewThisTime();
                AeSharedLibrary.clsSession.UserSession SessionStruct;
                SessionStruct = (AeSharedLibrary.clsSession.UserSession)Session["UserInformation"];
                SessionStruct.transId = InvoiceProcessStatusId;
                Session["UserInformation"] = SessionStruct;
                string popupScript = "<script language=javascript> window.open(‘../InvoiceManagement/ASyncXML.aspx’,’_blank’,’height=300,width=600,top=150,left=150,status=no,toolbar=no,menubar=no,location=no,scrollbars=no,resizable=no,copyhistory=false’)</script>";
                ClientScript.RegisterStartupScript(this.GetType(), "callpopup", popupScript);
            }
            else
            {
            }
        }
        else
        {
        }
    }
    protected void NewThisTime()
    {
        CheckBox chk;
        foreach (GridViewRow rowItem in gvInvoiceDetails.Rows)
        {
            chk = (CheckBox)(rowItem.Cells[0].FindControl("chkBoxChild"));
            if (chk.Checked == true)
            {
                int PartnerId = Convert.ToInt32(rowItem.Cells[3].Text.Trim().ToString());
                int billRunId = Convert.ToInt32(rowItem.Cells[1].Text.Trim().ToString());
                int billRunDetailId = Convert.ToInt32(rowItem.Cells[2].Text.Trim().ToString());
                LinkButton bill = (LinkButton)(rowItem.Cells[5].FindControl("lnkInvoice"));
                int billId = Convert.ToInt32(bill.Text);
                int InvoiceId = billId;
                string CustomerId = Convert.ToString(rowItem.Cells[4].Text.Trim());
                //Reset pool for the selected customer id here.
                AeBusinessLayer.ClassFiles.InvoiceCreated _invoice = new InvoiceCreated();
                int rtvalue = _invoice.ResetPool(CustomerId);
                if (rtvalue == 0)
                {
                    AeSharedLibrary.clsEmail.SendNewCustomerEmail("pawan.kumar@affinityexpress.co.in", "System is unable to reset the pool value", "Resetting Pool Value", null);
                }
                AeBusinessLayer.ClassFiles.XML _xml = new XML();
                _xml.CreateXML(PartnerId, InvoiceId, CustomerId, billRunId, billRunDetailId);
            }
        }
    }
    protected void btnCreateHTML_Click(object sender, EventArgs e)
    {
        if (this.hdnFlag.Value == "OK")
        {
            forhtml();
        }
    }
    protected void NewforHTML()
    {
        string _OutputDirectory = string.Empty;
        CheckBox chk;
        foreach (GridViewRow roowitem in gvInvoiceDetails.Rows)
        {
            chk = (CheckBox)(roowitem.Cells[0].FindControl("chkBoxChild"));
            if (chk.Checked == true)
            {
                LinkButton btn = (LinkButton)roowitem.Cells[5].FindControl("lnkInvoice");
                string str = btn.Text.ToString();
                int invoiceid = Convert.ToInt32(str);
                int partnerid = Convert.ToInt32(roowitem.Cells[3].Text);
                int billRunId = Convert.ToInt32(gvInvoiceDetails.Rows[0].Cells[1].Text.Trim().ToString());
                BatchSummary _incoivehtml = new BatchSummary();
                DataSet _dsinvoice = _incoivehtml.SelectinvoiceForHtmldetails(invoiceid);
                string customer_id = _dsinvoice.Tables[0].Rows[0]["customer_id"].ToString();
                DateTime dat = Convert.ToDateTime(_dsinvoice.Tables[0].Rows[0]["invoice_start_date"].ToString());
                DateTime date = dat;
                string Fillexml = string.Empty;
                try
                {
                    if (dat.Month.ToString().Length == 1)
                    {
                        if (dat.Day.ToString().Length == 1)
                            Fillexml = @"C:\Invoices\" + dat.Year + "-0" + dat.Month + "-0" + dat.Day + @"\" + partnerid + @"\" + "Inv" + invoiceid + ".xml";
                        else
                            Fillexml = @"C:\Invoices\" + dat.Year + "-0" + dat.Month + "-" + dat.Day + @"\" + partnerid + @"\" + "Inv" + invoiceid + ".xml";
                    }
                    else
                    {
                        if (dat.Day.ToString().Length == 1)
                            Fillexml = @"C:\Invoices\" + dat.Year + "-" + dat.Month + "-0" + dat.Day + @"\" + partnerid + @"\" + "Inv" + invoiceid + ".xml";
                        else
                            Fillexml = @"C:\Invoices\" + dat.Year + "-" + dat.Month + "-" + dat.Day + @"\" + partnerid + @"\" + "Inv" + invoiceid + ".xml";
                    }
                    string pathhtml = @"C:\Invoices\Emails\";
                    string targetfile = pathhtml + "\\" + date.Year + "-" + date.Month + "-" + date.Day + @"\" + partnerid + "\\" + invoiceid + ".html";
                    //string xslfile = "\\10.0.0.229\\Emails\\styleSheets\\" + "InternalToEmailFormatOne.xsl";
                    XsltArgumentList args = new XsltArgumentList();
                    args.AddParam("partnerid", "", partnerid);
                    args.AddParam("invoiceid", "", invoiceid);
                    _OutputDirectory = pathhtml + date.Year + "-" + date.Month + "-" + date.Day + @"\" + partnerid + "\\";
                    if (!Directory.Exists(_OutputDirectory))
                        Directory.CreateDirectory(_OutputDirectory);
                    //int retValue = transform(xslfile, Fillexml, args, targetfile);    — Replaced by code below Pawan.
                    XmlDocument transformDoc = new XmlDocument();
                    string str1 = @"\\10.0.0.229\\Emails\\styleSheets\\InternalToEmailFormatOne.xsl";
                    transformDoc.Load(str1);
                    XmlDocument sourceDoc = new XmlDocument();
                    sourceDoc.Load(Fillexml);
                    StreamWriter writer = new StreamWriter(targetfile, false, System.Text.Encoding.UTF8);
                    XslTransform trans = new XslTransform();
                    XmlUrlResolver resolver = new XmlUrlResolver();
                    GC.Collect();
                    trans.Load(transformDoc, resolver, System.AppDomain.CurrentDomain.Evidence);
                    trans.Transform(sourceDoc, args, writer, resolver);
                    writer.Flush();
                    writer.Close();
                    DataSet dsInvoiceStatusId = _incoivehtml.SelectTopInvoiceStatusId();
                    int Retz = _incoivehtml.UpdateInvoiceProcessStatusFORHTML(Convert.ToInt32(dsInvoiceStatusId.Tables[0].Rows[0][0].ToString()), "InProgress", 0, null, "In Progress", 0, null); 
                }
                catch (Exception exec)
                {
                    BatchSummary _bat = new BatchSummary();
                    DataSet dsInvoiceStatusId = _bat.SelectTopInvoiceStatusId();
                    BatchSummary _batch = new BatchSummary();
                    int returnValue = _batch.InsertIntoErrForHTMLGeneration(Convert.ToInt32(dsInvoiceStatusId.Tables[0].Rows[0][0].ToString()), exec.Message.ToString(), billRunId, partnerid, customer_id, invoiceid);
                }
            }
        }
    }
    protected void forhtml()
    {
        string _OutputDirectory = string.Empty;
        CheckBox chk;
        int totalNoOfHTMS = 0;
        foreach (GridViewRow roowitem in gvInvoiceDetails.Rows)
        {
            chk = (CheckBox)(roowitem.Cells[0].FindControl("chkBoxChild"));
            if (chk.Checked == true)
            {
                totalNoOfHTMS += 1;
            }
        }
        if (totalNoOfHTMS > 0)
        {
            int billRunId = Convert.ToInt32(gvInvoiceDetails.Rows[0].Cells[1].Text.Trim().ToString());
            InsertHTMLStatus(totalNoOfHTMS, billRunId);
            AeBusinessLayer.ClassFiles.BatchSummary _batch = new BatchSummary();
            DataSet dsInvoiceStatusId = _batch.SelectTopInvoiceStatusId();
            int InvoiceProcessStatusId = Convert.ToInt32(dsInvoiceStatusId.Tables[0].Rows[0][0].ToString());
            Thread td = new Thread(new ThreadStart(NewThisTime));               
            td.IsBackground = true;
            td.Start();
            NewforHTML();
            AeSharedLibrary.clsSession.UserSession SessionStruct;
            SessionStruct = (AeSharedLibrary.clsSession.UserSession)Session["UserInformation"];
            SessionStruct.transId = InvoiceProcessStatusId;
            Session["UserInformation"] = SessionStruct;
            string popupScript = "<script language=javascript> window.open(‘../InvoiceManagement/AsyncHTML.aspx’,’_blank’,’height=300,width=600,top=150,left=150,status=no,toolbar=no,menubar=no,location=no,scrollbars=no,resizable=no,copyhistory=false’)</script>";
            ClientScript.RegisterStartupScript(this.GetType(), "callpopup", popupScript);
        }
    }
    protected int transform(string xslfile, string sourcefile, XsltArgumentList args, string targetfile)
    {
        XmlDocument transformDoc = new XmlDocument();
        try
        {
            string str = @"\\10.0.0.229\\Emails\\styleSheets\\InternalToEmailFormatOne.xsl";
            transformDoc.Load(str);
            XmlDocument sourceDoc = new XmlDocument();
            sourceDoc.Load(sourcefile);
            StreamWriter writer = new StreamWriter(targetfile, false, System.Text.Encoding.UTF8);
            XslTransform trans = new XslTransform();
            XmlUrlResolver resolver = new XmlUrlResolver();
            GC.Collect();
            trans.Load(transformDoc, resolver, System.AppDomain.CurrentDomain.Evidence);
            trans.Transform(sourceDoc, args, writer, resolver);
            writer.Flush();
            writer.Close();
        }
        catch (System.Exception e)
        {
            return 0;
        }
        return 1;
    }
}