using System;
using System.Data;
using System.Data.SqlClient;

namespace Baza_Reklam
{
    class DbUtils
    {
        public static object ExecuteQuery(string query)
        {
            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

            SqlCommand command = new SqlCommand(query);
            command.Connection = conn;

            conn.Open();
            object result = command.ExecuteScalar();
            command.Dispose();
            conn.Close();

            return result;
        }

        public static float pobierzSzerModulu(string mod_typ)
        {
            if (string.IsNullOrEmpty(mod_typ)) return 0;

            string query = "select MOD_SZER from dbo.[NAZWY MODUŁÓW] where MOD_TYP='" + mod_typ + "'";

            object result = ExecuteQuery(query);

            if (result == null || result is DBNull) return 0;

            return (float) (result);
        }

        public static float pobierzWysModulu(string mod_typ)
        {
            if (string.IsNullOrEmpty(mod_typ)) return 0;

            string query = "select MOD_WYS from dbo.[NAZWY MODUŁÓW] where MOD_TYP='" + mod_typ + "'";

            object result = ExecuteQuery(query);

            if (result == null || result is DBNull) return 0;

            return (float)(result);
        }

        /// <summary>
        /// Zwraca customerId danej reklamy
        /// </summary>
        public static int customerId(int reklamaId)
        {

            string query = "select customerId from Reklama where reklamaId=" + reklamaId;

            return (int)(ExecuteQuery(query) ?? 0);
        }


        /// <summary>
        /// Zwraca Id loga przypisanego do danej reklamy
        /// </summary>
        public static int logoId(int reklamaId)
        {
            string query = "select logoId from Reklama where reklamaId=" + reklamaId;
            return (int)(ExecuteQuery(query) ?? 0);
        }


        /// <summary>
        /// Funkcja sprawdza czy logo jest użyte w ktorejs z reklam.
        /// </summary>
        public static bool logoByloWykorzystane(int logoID)
        {
            string query = "select count(*) from reklama where logoID=" + logoID;

            int result = 0;
            result = (int)(ExecuteQuery(query) ?? result);

            return (result != 0 ? false : true);
        }

        /// <summary>
        /// Funkcja sprawdza czy handlowiec wystawił jużw danym roku fakturę o danym numerze.
        /// </summary>
        public static bool istniejeFaktura(int nr, string kod, int rok)
        {
            string query = "select count(*) from faktury where NUMER=" + nr + " aND NUMER_ROZ='" + kod + "' AND NUMER_ROK=" + rok;
         
            int result = 0;
            result = (int)(ExecuteQuery(query) ?? result);

            return (result == 0 ? false : true);
        }

        /// <summary>
        /// Zwraca nazwę agencji dla danego agenta.
        /// </summary>
        public static string nazwaAgencji(string symbolAgenta)
        {
            string query = "select A2.Symbol from agenci A left outer join Agencje A2 on A.id_agencji=A2.id_agencji where A.Symbol ='" + symbolAgenta +"'";

            return (string)(ExecuteQuery(query) ?? "?");
        }

        /// <summary>
        /// Zwraca id agencji dla danego agenta.
        /// </summary>
        public static int idAgencji(string symbolAgenta)
        {
            if (string.IsNullOrEmpty(symbolAgenta)) return 0;

            string query = "select id_Agencji from agenci where Symbol ='" + symbolAgenta +"'";

            return (int)(ExecuteQuery(query) ?? 2);
        }

        /// <summary>
        /// Zwraca id agencji dla danego agenta.
        /// </summary>
        public static int idAgencjiWgKoduAgenta(string kodAgenta)
        {
            string query = "select id_Agencji from agenci where F_ROZ ='" + kodAgenta + "'";

            return (int)(ExecuteQuery(query) ?? 2);
        }


        /// <summary>
        /// Sprawdza czy istnieje już w bazie dany kod rozliczeniowy.
        /// </summary>
        public static bool tagAgentaUnikalny(string tagAgenta, int id)
        {
            string query = "select count(*) from agenci where F_ROZ='" +  tagAgenta + "'";

            if (id != 0)
                query += " and id_agenta<>" + id;

            int result = (int)ExecuteQuery(query);

            return (result == 0 ? true : false);
        }

        /// <summary>
        /// Sprawdza czy istnieje już w bazie dany kod rozliczeniowy.
        /// </summary>
        public static bool IsLoginUnique(string login, int id)
        {
            string query = "select count(*) from agenci where symbol='" + login + "'";
            if (id != 0)
                query += " and id_agenta<>" + id;

            int result = (int)ExecuteQuery(query);

            return (result == 0 ? true : false);
        }

        /// <summary>
        /// VIES ma wartości w bazie: -1,0,1,NULL...
        /// </summary>
        public static bool czyKlientMaNrVIES(int customerID)
        {
            string query = "select VIES from klienci where customerId=" + customerID + " and VIES is not null ";

            short result = (short)(ExecuteQuery(query) ?? Convert.ToInt16(0));

            result = Math.Abs(result);

            if (result > 0) return true;
            
            return false;
        }

      
        public static string mailKlienta(int customerID)
        {
            string query = "select Email from klienci where customerId=" + customerID + " and email is not null ";

            string result = (string)(ExecuteQuery(query) ?? "");

            return result;
        }


        /// <summary>
        /// Zwraca kod rozliczeniowy agenta (tag Agenta).
        /// </summary>
        public static string tagAgenta(string symbolAgenta)
        {
           string query = "select F_ROZ from agenci where Symbol ='" + symbolAgenta + "'";
           
           return (string)(ExecuteQuery(query) ?? "?");
        }




        /// <summary>
        /// Zwraca numer nowego reklamy. W try - catch z powoodu bzdurnych danych w bazie.
        /// </summary>
        public static int numerNowejReklamy(string symbolAgenta, string tagAgenta)
        {
            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

            SqlCommand command = new SqlCommand();
            command.CommandType = CommandType.Text;
            //  command.CommandText = "select distinct [id reklamy] from reklama where [symbol akwizytora]=@symbolAgenta";
            //  command.Parameters.AddWithValue("@symbolAgenta", symbolAgenta);

            command.CommandText = "select distinct [id reklamy] from reklama where [id reklamy] like '%' + @tagAgenta + '%'";
            command.Parameters.AddWithValue("@tagAgenta", tagAgenta);
            command.Connection = conn;

            conn.Open();

            SqlDataReader reader = command.ExecuteReader();

            int max = 0;
            int nr = 0;

            while (reader.Read())
            {
                if ((reader.GetValue(0).ToString()).Substring(0, tagAgenta.Length) == tagAgenta)
                {

                    // Int32.TryParse((reader.GetValue(0).ToString()).Substring(tagAgenta.Length, 3), out nr);
                    //W try - catch z powoodu bzdurnych danych w bazie.
                    try
                    {
                        nr = Int32.Parse((reader.GetValue(0).ToString()).Substring(tagAgenta.Length, 3));
                    }
                    catch
                    {
                        //TODO: check when it can fail...
                    }

                    if (nr > max)
                    {
                        max = nr;
                    }
                }
            }
            conn.Close();

            return max + 1;
        }


        /// <summary>
        /// Zwraca ilość kontaktów z poprzedniego miesiąca
        /// </summary>
        public static int iloscKontaktowAgenta(string login)
        {
            string query = "select count(*) from dbo.KONTAKTY where symbol_agenta ='" +
                login + "' and year(data)=" + DateTime.Today.AddMonths(-1).Year +" and month(data)=" + DateTime.Today.AddMonths(-1).Month;

            int ilosc = (int)ExecuteQuery(query);
            return ilosc;
        }

        /// <summary>
        /// Zwraca numer następnej faktury danego agenta.
        /// </summary>
        public static int numerNowejFaktury(string tagAgenta, int year, int systemKsiegowy)
        {
            string query = "SELECT MAX(Numer) FROM Faktury WHERE Korekta=0 AND [Numer_Roz]='" + tagAgenta + "' AND [Numer_Rok]=" + year + " AND SystemKsiegowyId=" + systemKsiegowy;

            object nr = ExecuteQuery(query);
            if (nr is DBNull) return 1;
            return ((int)nr + 1);
        }


        /// <summary>
        /// Zwraca numer nowego zamówienia
        /// </summary>
        public static int numerNowegoZamowienia(int idKlienta, int year, string kodAgenta)
        {
            string query = "SELECT MAX(nrZamowienia) FROM Zamowienia WHERE idKlienta=" + idKlienta + " AND rokZamowienia=" + year + " AND kodAgenta='" + kodAgenta + "'";

            object nr = ExecuteQuery(query);
            if (nr is DBNull) return 1;
            return ((int)nr + 1);
        }

        /// <summary>
        /// Sprawdza czy istnieje już w bazie dany kod rozliczeniowy.
        /// </summary>
        public static bool kodKlientaUnikalny(string kodKlienta, string symbolAgenta, int customerId)
        {
            if (string.IsNullOrEmpty(kodKlienta)) return true;

            string query = "select count(*) from klienci where kodKlienta = '" + kodKlienta + "' and username = '" + symbolAgenta + "'" +
                           " and customerId <> " + customerId;

            int result = (int)ExecuteQuery(query);

            return (result == 0 ? true : false);
        }
    }
}
