using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using Baza_Reklam.Classes.Model;
using System.Windows.Forms;

namespace Baza_Reklam.Classes.Repositories
{
    class ProvisionRepository : Repository<Provision>
    {
        public ProvisionRepository(string connectionString)
            : base(connectionString)
        {
            ;
        }

        public List<Provision> FindAll(int year, int month, string oddzial)
        {
            string query = "SELECT idProwizji, agencja, IsNull(agent, '') AS agent, rok, ms, nrFaktury, IsNull(netto, 0) AS netto, "
                            + "IsNull(nrFakturyKorygowanej, '') AS nrFakturyKorygowanej, IsNull(procentProwizji, 0) AS procentProwizji, "
                            + "IsNull(ZP, 0) AS ZP, IsNull(kwotaProwizji, 0) AS kwotaProwizji, idFaktury "
                            + "FROM PROWIZJE WHERE rok=@year AND ms=@month";

            if (!string.IsNullOrEmpty(oddzial))
                query += " AND agencja=@oddzial ";

            List<Provision> provisions = new List<Provision>();

            try
            {
                _connection.Open();
                _command = new SqlCommand(query, _connection);
                _command.Parameters.AddWithValue("@year", year);
                _command.Parameters.AddWithValue("@month", month);
                if (!string.IsNullOrEmpty(oddzial))
                    _command.Parameters.AddWithValue("@oddzial", oddzial);

                _reader = _command.ExecuteReader();

                while (_reader.Read())
                {
                    provisions.Add(new Provision(_reader.GetInt32(0), _reader.GetString(1), _reader.GetString(2), _reader.GetInt32(3), _reader.GetInt32(4),
                        _reader.GetString(5), _reader.GetDecimal(6), _reader.GetString(7), _reader.GetDouble(8), _reader.GetBoolean(9), _reader.GetDecimal(10), _reader.GetInt32(11)));
                }
            }
            catch (Exception ex)
            {
                string s1 = ex.ToString();
                MessageBox.Show(s1);
            }
            finally
            {
                CleanUp();
            }

            return provisions;
        }

        public bool Save(List<Provision> provisions)
        {
            const string query = "UPDATE PROWIZJE SET agencja=@agencja, agent=@agent, procentProwizji=@procentProwizji, ZP=@ZP "
                            + "WHERE idProwizji=@id";

            try
            {
                _connection.Open();
                _command = new SqlCommand(query, _connection);

                foreach (Provision pr in provisions)
                {
                    _command.Parameters.Clear();
                    _command.Parameters.AddWithValue("@agencja", pr.Agencja);
                    _command.Parameters.AddWithValue("@agent", pr.Agent);
                    _command.Parameters.AddWithValue("@procentProwizji", pr.ProcentProwizji);
                    _command.Parameters.AddWithValue("@ZP", pr.ZP);
                    _command.Parameters.AddWithValue("@id", pr.Id);

                    int n = _command.ExecuteNonQuery();
                }

                return true;
            }
            catch (Exception ex)
            {
                string s1 = ex.ToString();
                MessageBox.Show(s1);
            }
            finally
            {
                CleanUp();
            }

            return false;
        }

    }
}
