using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using PrometeiaMessage.bancafideuram.nac.posizionecliente;
using PrometeiaMessage;

public partial class PosizioneClienteWS
{
    public DataTable GetDettaglioAssicurativi(ChiaveCliente chiave, string codiceContratto, string codiceInterno, DettaglioOperazione[] dettaglioOperazioni, InfoClient infoCliente, int chiaveclientepb)
    {
        ////Rattà gestione fiduciarie
        //this.setCodiceFiscaleMandatoFiduciarie(ref chiave);
        GestioneCliente.ImpostaCodiceFiscaleMandato(chiaveclientepb, ref chiave);

        string chiaveS = "PosizioneClienteWS_GetDettaglioAssicurativi" + codiceContratto + "_" + codiceInterno;
        HttpContext contesto = HttpContext.Current;

        object dettaglioAssicurativi = null;

        if (contesto != null && contesto.Session != null)
            dettaglioAssicurativi = contesto.Session[chiaveS];

        if (dettaglioAssicurativi != null)
        {
            return (DataTable)dettaglioAssicurativi;
        }
        else
        {
            #region Chiamata al metodo getDettaglioAssicurativi del WebServices PosizioneCliente
            string _wsurl = ConfigurationManager.AppSettings["WSPOSIZIONECLIENTE"].ToString();
            string _nomeutente = ConfigurationManager.AppSettings["NOMEUTENTENAC"].ToString();
            string _password = ConfigurationManager.AppSettings["PASSWORDNAC"].ToString();
            DataTable dtGetDettaglioAssicurativi;
            DettaglioAssicurativiRes risposta;

            string _proxy;
            if (ConfigurationManager.AppSettings["PROXY"] != null)
                _proxy = ConfigurationManager.AppSettings["PROXY"].ToString();
            else
                _proxy = "";
            #endregion

            try
            {
                #region Chiamata al metodo getDettaglioAssicurativi del WebServices PosizioneCliente
                PosizioneCliente wsposizionecliente = new PosizioneCliente();
                wsposizionecliente.PreAuthenticate = true;
                wsposizionecliente.Url = _wsurl;

                System.Net.NetworkCredential cred = new System.Net.NetworkCredential(_nomeutente, _password);
                wsposizionecliente.Credentials = cred;

                // Settaggio eventuale proxy
                if (_proxy.Trim() != "")
                    wsposizionecliente.Proxy = new System.Net.WebProxy(_proxy);

                System.Net.ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(VerifyServerCertificate);

                risposta = wsposizionecliente.getDettaglioAssicurativi(chiave, codiceContratto, codiceInterno, dettaglioOperazioni, infoCliente);
                #endregion

                #region Creazione DataTable GetDettaglioAssicurativi e aggiungo una riga e la aggiungo alla tabella
                dtGetDettaglioAssicurativi = new DataTable("DTDETTAGLIOASSICURATIVI");
                dtGetDettaglioAssicurativi.Columns.Add("CODICECONTRATTO", typeof(string));
                dtGetDettaglioAssicurativi.Columns.Add("CODICEINTERNO", typeof(string));
                dtGetDettaglioAssicurativi.Columns.Add("CODICESOTTOPRODOTTO", typeof(string));
                dtGetDettaglioAssicurativi.Columns.Add("DELTA", typeof(double));
                dtGetDettaglioAssicurativi.Columns.Add("IMPORTOFINALE", typeof(double));
                dtGetDettaglioAssicurativi.Columns.Add("IMPORTOINIZIALE", typeof(double));
                dtGetDettaglioAssicurativi.Columns.Add("ISINFITTIZIO", typeof(string));

                DataRow row;
                if (risposta.info.Errors.Length == 0)
                {
                    foreach (DettaglioAssicurativi da in risposta.dettagliAssicurativi)
                    {
                        row = dtGetDettaglioAssicurativi.NewRow();
                        row["CODICECONTRATTO"] = da.codiceContratto;
                        row["CODICEINTERNO"] = da.codiceInterno;
                        row["CODICESOTTOPRODOTTO"] = da.codicesottoProdotto;
                        row["DELTA"] = Math.Round(da.delta, 2, MidpointRounding.ToEven);
                        row["IMPORTOFINALE"] = Math.Round(da.importoFinale, 2, MidpointRounding.ToEven);
                        row["IMPORTOINIZIALE"] = Math.Round(da.importoIniziale, 2, MidpointRounding.ToEven);
                        row["ISINFITTIZIO"] = da.isinFittizio;

                        dtGetDettaglioAssicurativi.Rows.Add(row);
                    }
                }
                else
                {
                    if (risposta.info.Errors[0].CodiceErrore == 50)
                    {
                        Exception ex = new Exception();
                        ex.Data.Add("CodiceErrore", 50);
                        throw new Exception(risposta.info.Errors[0].MessaggioPerUtenteFinale, ex);
                    }
                    else
                        throw new Exception(risposta.info.Errors[0].MessaggioPerUtenteFinale);
                }
                #endregion
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + "; Web Service: PosizioneCliente; Web Method: GetDettaglioAssicurativi", ex.InnerException);
            }

            if (contesto != null && contesto.Session != null)
                contesto.Session[chiaveS] = dtGetDettaglioAssicurativi;

            return dtGetDettaglioAssicurativi;
        }
    }

    private bool VerifyServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        foreach (X509ChainStatus s in chain.ChainStatus)
        {
            // allows expired certificates
            if (string.Equals(s.Status.ToString(), "NotTimeValid",
                StringComparison.OrdinalIgnoreCase))
                return true;
        }

        return true;
    }

    //private void setCodiceFiscaleMandatoFiduciarie(ref ChiaveCliente _chiaveCliente)
    //{
    //    if (_chiaveCliente.codiceFiscale.Contains("@"))
    //    {
    //        PrometeiaMessage.Fiduciarie _fiduciarie = new PrometeiaMessage.Fiduciarie();
    //        _fiduciarie.LoadFiduciarie();
    //        string[] valori = _chiaveCliente.codiceFiscale.Split('@');
    //        _chiaveCliente.codiceFiscale = _fiduciarie.getPIva(valori[0]);
    //        _chiaveCliente.codiceMandato = valori[1];

    //    }
    //}
}