using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Consulenza.ReportArchive.Entity;
using System.Data;

namespace Consulenza.ReportArchive
{
    public class ReportArchiveManager
    {

        public long SetDocumentPdf(DocumentoPdf documentoPdf,string idProvenienza) { 
            return setDocumentPdf(documentoPdf,idProvenienza); 
        }
        
        public int DelPdf(long idPdf, string idProvenienza) { 
            return delPdf(idPdf, idProvenienza); 
        }
        
        public int SetStato(long idPdf,string idstato, string idProvenienza) {

            


            return setStato(idPdf, idstato, idProvenienza);
        }
               
        public List<LogPdf> GetlogPdf(long idPdf) { 
            return getLogPdf(idPdf); 
        }

        public List<DocumentoPdf> GetPdfs(RicercaPdf ricercaPdf) { return getPdf(ricercaPdf); }

        public DocumentoPdf GetPdf (long idPdf) {
            RicercaPdf ricercaPdf = new RicercaPdf();
            ricercaPdf.IdPdf = idPdf;
            DocumentoPdf documentoPdf = getPdf(ricercaPdf).First<DocumentoPdf>();
            documentoPdf.Image = getImage(idPdf);
            return documentoPdf;
        }

        
        private long setDocumentPdf(DocumentoPdf documentoPdf,string idProvenienza)
        {
            List<Parametro> pDocumentPdf = new List<Parametro>();
            pDocumentPdf.Add(new Parametro { Value = idProvenienza, ParameterName = "idProvenienza" });
            pDocumentPdf.Add(new Parametro { Value = documentoPdf.IdModello, ParameterName = "idModello" });
            pDocumentPdf.Add(new Parametro { Value = documentoPdf.IdStato, ParameterName = "idStato" });
            pDocumentPdf.Add(new Parametro { Value = documentoPdf.IdArchivio, ParameterName = "idArchivio" });
            pDocumentPdf.Add(new Parametro { Value = documentoPdf.CodicePB, ParameterName = "CodicePB" });
            pDocumentPdf.Add(new Parametro { DbType = DbType.Binary, Value = documentoPdf.Image, ParameterName = "Image" });
            pDocumentPdf.Add(new Parametro { Value = documentoPdf.Note, ParameterName = "Note" });
            pDocumentPdf.Add(new Parametro { Value = DocumentoPdf.ChiaveClientePb(documentoPdf.Clienti), ParameterName = "chiaviClientePb" });
            pDocumentPdf.Add(new Parametro { Value = DocumentoPdf.codiceContratto(documentoPdf.Clienti), ParameterName = "CodiceContratto" });
             pDocumentPdf.Add(new Parametro { Value = DocumentoPdf.ChiaveProposta(documentoPdf.Clienti), ParameterName = "chiaveProposta" });
             pDocumentPdf.Add(new Parametro { Value = DocumentoPdf.PropostaBase(documentoPdf.Clienti), ParameterName = "PropostaBase" });
 
            pDocumentPdf.Add(new Parametro { Value = documentoPdf.ChiaveNucleo, ParameterName = "chiaveNucleo" });

            long IdPdf = (long)DataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerReportArchive, "INSERTPDF", pDocumentPdf);
          
            return IdPdf;
        }

        private byte[] getImage(long idPdf)
        {
            List<Parametro> param = new List<Parametro>();
            param.Add(new Parametro { Value = idPdf, ParameterName = "idPdf" });
            DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerReportArchive, "READIMAGEPDF", param);
            return (byte[])dt.Rows[0]["IMAGE"];
        }
        
        private List<LogPdf> getLogPdf(long idPdf)
        {
            List<Parametro> param = new List<Parametro>();
            param.Add(new Parametro { Value = idPdf, ParameterName = "idPdf" });
            DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerReportArchive, "GETLOGPDF", param);
            return (from DataRow row in dt.Rows
                    select new LogPdf
                    {
                        IdPdf = int.Parse(row["idPdf"].ToString()),
                        Dtstamp = row["dtstamp"].ToString(),
                        Evento = row["Evento"].ToString(),
                        EventoDesc = row["EventoDesc"].ToString(),                        
                        Provenienza = row["Provenienza"].ToString(),
                        Utente = row["utente"].ToString(),
                    }).ToList<LogPdf>();
        }

        private int delPdf(long idPdf, string idProvenienza)
        {
            List<Parametro> param = new List<Parametro>();
            param.Add(new Parametro { Value = idPdf, ParameterName = "idPdf" });
            param.Add(new Parametro { Value = idPdf, ParameterName = "idProvenienza" });
            DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerReportArchive, "DELETEPDF", param);
            return 0;
        }
        
        private int setStato(long idPdf, string idstato, string idProvenienza)
        {
            List<Parametro> param = new List<Parametro>();
            param.Add(new Parametro { Value = idPdf, ParameterName = "idPdf" });
            param.Add(new Parametro { Value = idstato, ParameterName = "idstato" });
            param.Add(new Parametro { Value = idProvenienza, ParameterName = "idProvenienza" });
            return (int)DataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerReportArchive, "SETSTATOPDF", param);
 
        
        }
        
        private List<DocumentoPdf> getPdf(RicercaPdf ricercaPdf) { 
            
             List<Parametro> param = new List<Parametro>();
            param.Add(new Parametro { Value = ricercaPdf.IdPdf, ParameterName = "idPdf" });
            param.Add(new Parametro { Value = ricercaPdf.ChiaveClientePb, ParameterName = "chiaveClientePb" });
            param.Add(new Parametro { Value = ricercaPdf.ChiaveNucleo, ParameterName = "chiaveNucleo" });
            param.Add(new Parametro { Value = ricercaPdf.CodiceContratto, ParameterName = "codiceContratto" });
            param.Add(new Parametro { Value = ricercaPdf.CodicePb, ParameterName = "codicePb" });
            if (ricercaPdf.DtFine < DateTime.MaxValue && ricercaPdf.DtFine > DateTime.MinValue)
                param.Add(new Parametro { DbType=System.Data.DbType.DateTime, Value = ricercaPdf.DtFine, ParameterName = "dtFine" });
            if (ricercaPdf.DtInizio < DateTime.MaxValue && ricercaPdf.DtInizio > DateTime.MinValue)
                param.Add(new Parametro { DbType = System.Data.DbType.DateTime, Value = ricercaPdf.DtInizio, ParameterName = "dtInizio" });
            param.Add(new Parametro { Value = ricercaPdf.IdArchivio, ParameterName = "idArchivio" });
            param.Add(new Parametro { Value = RicercaPdf.idModelli(ricercaPdf.IdModello), ParameterName = "idModello" });
            param.Add(new Parametro { Value = ricercaPdf.IdProvenienza, ParameterName = "idProvenienza" });
            param.Add(new Parametro { Value = ricercaPdf.IdStato, ParameterName = "idStato" });             
            param.Add(new Parametro { Value = ricercaPdf.ChiaveProposta, ParameterName = "chiaveProposta" });
            param.Add(new Parametro { Value = ricercaPdf.PropostaBase, ParameterName = "propostaBase" });     

            

            DataTable dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerReportArchive, "GETPDF", param);

            List<DocumentoPdf> documentoPdf =
                     (from DataRow row in dt.Rows
                      group row by new
                      {
                          ChiaveNucleo = row["ChiaveNucleo"]!=DBNull.Value?long.Parse(row["ChiaveNucleo"].ToString()):0,                                             
                          CodicePB = row["CodicePB"].ToString(),
                          IdArchivio = row["IdArchivio"].ToString(),
                          IdModello = row["IdModello"]!=DBNull.Value?int.Parse(row["IdModello"].ToString()):0,                          
                          IdPdf = row["IdPdf"] != DBNull.Value ? long.Parse(row["IdPdf"].ToString()) : 0, 
                          IdStato = row["IdStato"].ToString(),                         
                          Note = row["Note"].ToString(),
                          //Image = null, 
                          dtCreazione = DateTime.Parse(row["dtCreazione"].ToString()),
                          dtRestore = row["dtRestore"] != DBNull.Value ? DateTime.Parse(row["dtRestore"].ToString()) : new DateTime(),
                          dtEliminato = row["dtEliminato"] != DBNull.Value ? DateTime.Parse(row["dtRestore"].ToString()) : new DateTime()
                      } into doc
                      select new DocumentoPdf
                      {
                          ChiaveNucleo = doc.Key.ChiaveNucleo,
                          CodicePB = doc.Key.CodicePB,
                          IdArchivio = doc.Key.IdArchivio,
                          IdModello = doc.Key.IdModello,
                          IdPdf = doc.Key.IdPdf,
                          IdStato = doc.Key.IdStato,
                          Image = null,
                          Note = doc.Key.Note,
                          Clienti = (from DataRow rowC in dt.Rows 
                                     where long.Parse(rowC["idPdf"].ToString())==doc.Key.IdPdf 
                                     select new Cliente {
                                         ChiaveClientePb = rowC["ChiaveClientePb"] != DBNull.Value ? long.Parse(rowC["ChiaveClientePb"].ToString()) : 0, 
                                         CodiceContratto = rowC["CodiceContratto"].ToString(),
                                         ChiaveProposta = rowC["ChiaveProposta"] != DBNull.Value ? long.Parse(rowC["ChiaveProposta"].ToString()) : 0,
                                         PropostaBase = rowC["PropostaBase"].ToString(),
                          }).ToList<Cliente>(),
                          dtCreazione = doc.Key.dtCreazione,
                          dtRestore = doc.Key.dtRestore,
                          dtEliminato = doc.Key.dtEliminato,
                          logPdf = getLogPdf(doc.Key.IdPdf)
                      }).ToList<DocumentoPdf>();
            return documentoPdf;
        }
       
    }
}
