using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Data.Odbc;

namespace DataUploader
{
    public class GestData
    {
        protected GestData()
        {
            setupConnString();
        }
        protected OdbcConnection conn;
        /// <summary>
        /// configurazione stringa connesisone dati
        /// </summary>
        private void setupConnString()
        {
            conn = new OdbcConnection();
            // ho creato un DSN di sistema a nome "DB_Sigla" cui faccio riferimento (32 perché 32 bit x mia demo... ho dovuto convertire accdb in mdb...)
            string connectionString = "Dsn=DB_Sigla32;Initial Catalog=DB2_TESDOCUM;"; // qui va sistemato correttamente
            //string connectionString = "Driver={Microsoft Access Driver(*.mdb, *.accdb)};DBQ=C:\\DB_SIGLA.accdb;";
            conn.ConnectionString = connectionString;
        }

        public static GestData proc = new GestData();

        /// <summary>
        /// restituisce un array di stringhe URL da chiamare per caricare i dati documento / cliente
        /// </summary>
        /// <param name="numeroFrom">numero ultimo doc caricato (restituirà docs successivi)</param>
        /// <returns></returns>
        public string[] getNewDocsUrls(int numeroFrom)
        {
            
            // VA FATTO, è un FAKE x cui NON recupera dati, va costruito codice SQL x recuperare ogni doc NON ancora caricato, e poi caricato il doc va caricato anche il cliente, seguire esempio successivo


            // ipotesi: si caricano maxDocsToUpload documenti alal volta (e quindi altrettanti clienti)
            int maxDocsToUpload = Convert.ToInt32(ConfigurationManager.AppSettings["maxDocsToUpload"]);
            string[] answ = new string[maxDocsToUpload * 2]; // 2 stringhe, una x doc e 1 x cliente x ogni invio...
            string[] rDoc = new string[19];
            string[] rCli = new string[12];

            // qui va fatto ciclo x spazzare 1 ad 1 i docuemnti ed i relativi clienti

            for (int i = 0; i < 19; i++)
            {
                rDoc[i] = "";
            }
            for (int i = 0; i < 11; i++)
            {
                rCli[i] = "";
            }


            // caricati i 2 record vanno costruiti gli url di risposta... accodando 2 alla volta doc / cliente
            answ[0] = createUrlDoc(rDoc);
            answ[1] = createUrlCli(rCli);

            // end ciclo, resituisco tutti i records
            return answ;
        }
        /// <summary>
        /// restituisce un array di stringhe URL da chiamare per caricare i dati documento / cliente
        /// </summary>
        /// <param name="CodDoc">Codice documento richiesto</param>
        /// <param name="Anno">Anno documento richiesto</param>
        /// <returns></returns>
        public string[] getDocsUrls(string CodDoc, string Anno)
        {
            string[] answ = new string[2]; // 2 stringhe, una x doc e 1 x cliente x ogni invio...
            // per ogni record trovato compongo un record DOCS ed uno CLI
            string[] rDoc = new string[19];
            string[] rCli = new string[12];

            // effettuo chaimata ODBC e recupero dati
            try
            {
                conn.Open();
                string tipoDoc = CodDoc.Substring(0,2);
                string NumDoc = CodDoc.Replace(tipoDoc,"");
                // questa è la vera stringa SQL
                string comandoDoc = string.Format("SELECT DB2_TESDOCUM.TIPOPROTOC, DB2_TESDOCUM.NUMERO, DB2_TESDOCUM.ESERPROTOC, DB2_TESDOCUM.NUMEPROTOC, DB2_TESDOCUM.DATAPROTOC, DB2_TESDOCUM.ESERRIFERI, DB2_TESDOCUM.NUMERIFERI, DB2_TESDOCUM.TIPORIFERI, DB2_TESDOCUM.DATARIFERI, DB2_TESDOCUM.NUMEDOCRIF, DB2_TESDOCUM.DATADOCRIF, DB2_TESDOCUM.ESERCOLLEG, DB2_TESDOCUM.CLI_FOR, DB2_TESDOCUM.DESTINATAR, DB2_TESDOCUM.RGSOC_DEST, DB2_TESDOCUM.INDIR_DEST, DB2_TESDOCUM.LOCAL_DEST, DB2_TESDOCUM.CAP_DEST, DB2_TESDOCUM.ULT_AGG FROM DB2_TESDOCUM WHERE DB2_TESDOCUM.TIPOPROTOC='{0}' AND DB2_TESDOCUM.NUMEPROTOC ='{1}' AND DB2_TESDOCUM.ESERPROTOC ='{2}';", tipoDoc, NumDoc, Anno);
                // dati documento
                using (OdbcCommand com = new OdbcCommand(comandoDoc, conn))
                {
                    using (OdbcDataReader reader = com.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            for (int i = 0; i < 19; i++)
                            {
                                try
                                {
                                    rDoc[i] = reader.GetString(i).Trim().Replace(" ","+");
                                }
                                catch
                                {
                                    rDoc[i] = "";
                                }
                            }
                            // il campo 12 è il cod cliente!
                            rCli[0] = rDoc[12];
                            // formatto answ...
                            answ[0] = createUrlDoc(rDoc);
                        }
                    }
                }

                // dati cliente! ATTENZIONE NON HO TROVATO NE EMAIL NE CELL!!! messi valori "empty" al posto giusto... '' x cellulare, 1 x enable sms (dovrebbe essere SOLO SE si trova cellulare) e '' per email, '' per note (se ci fosse qualcosa...)
                string comandoCli = string.Format("SELECT DB2_CLIFO.CODICE, DB2_CLIFO.RAGIONESOC, DB2_CLIFO.COFI, DB2_CLIFO.TEL, '' AS CELL, 1 AS ENABLE_SMS, '' AS EMAIL,  DB2_CLIFO.INDIR1, DB2_CLIFO.CAP, DB2_CLIFO.LOCALITA, DB2_CLIFO.PROVINCIA, '' AS NoteCli FROM DB2_CLIFO WHERE DB2_CLIFO.TIPO='C' AND DB2_CLIFO.CODICE = '{0}';", rCli[0]);
                using (OdbcCommand comCli = new OdbcCommand(comandoCli, conn))
                {
                    using (OdbcDataReader readerCli = comCli.ExecuteReader())
                    {
                        while (readerCli.Read())
                        {
                            for (int i = 0; i < 12; i++)
                            {
                                try
                                {
                                    rCli[i] = readerCli.GetString(i).Trim().Replace(" ", "+");
                                }
                                catch
                                {
                                    rCli[i] = "";
                                }
                            }
                        }
                    }
                }
                // formatto answ...
                answ[1] = createUrlCli(rCli);
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.message);
            }
            finally
            {
                conn.Close();
            }
            return answ;
        }
        /// <summary>
        /// crea url formattato x upload DOC
        /// </summary>
        /// <param name="rDoc"></param>
        /// <returns></returns>
        protected string createUrlDoc(string[] rDoc)
        {
            string answ = "";
            try
            {
                answ = string.Format(@"{0}?TIPOPROTOC={1}&NUMERO={2}&ESERPROTOC={3}&NUMEPROTOC={4}&DATAPROTOC={5}&ESERRIFERI={6}&NUMERIFERI={7}&TIPORIFERI={8}&DATARIFERI={9}&NUMEDOCRIF={10}&DATADOCRIF={11}&ESERCOLLEG={12}&CLI_FOR={13}&DESTINATAR={14}&RGSOC_DEST={15}&INDIR_DEST={16}&LOCAL_DEST={17}&CAP_DEST={18}&ULT_AGG={19}", ConfigurationManager.AppSettings["remoteDocUrl"], rDoc[0], rDoc[1], rDoc[2], rDoc[3], rDoc[4], rDoc[5], rDoc[6], rDoc[7], rDoc[8], rDoc[9], rDoc[10], rDoc[11], rDoc[12], rDoc[13], rDoc[14], rDoc[15], rDoc[16], rDoc[17], rDoc[18]);
            }
            catch (Exception exc)
            { }
            return answ;
        }
        /// <summary>
        /// crea url formattato x upload CLI
        /// </summary>
        /// <param name="rCli"></param>
        /// <returns></returns>
        protected string createUrlCli(string[] rCli)
        {
            string answ = "";
            try
            {
                answ = string.Format("{0}?CodCliente={1}&RagSoc={2}&CodFis={3}&Tel={4}&Cell={5}&EnableSMS={6}&Email={7}&Indir={8}&Cap={9}&Localita={10}&Prov={11}&Note={12}", ConfigurationManager.AppSettings["remoteCliUrl"], rCli[0], rCli[1], rCli[2], rCli[3], rCli[4], rCli[5], rCli[6], rCli[7], rCli[8], rCli[9], rCli[10], rCli[11]);
            }
            catch (Exception exc)
            { }
            return answ;
        }
    }
}