using System;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;

namespace Baza_Reklam
{
    public partial class FacturesFormNEW : Form
    {
        private const string query = "SELECT top 2000 * from VIEW_ZESTAWIENIE_FAKTUR_NOWE ";

        private static FacturesFormNEW fakturesForm;
        private readonly SqlCommand command;
        private readonly SqlDataAdapter sqlDataAdapter;

        private bool commandExecuted;

        public static FacturesFormNEW getFacturesForm(MDIBazaReklam parent)
        {
            if (fakturesForm == null){
                fakturesForm = new FacturesFormNEW(parent);
            }
            return fakturesForm;
        }

        private FacturesFormNEW(Form parent)
        {
            InitializeComponent();

            MdiParent = parent;

            //podmiana connstringa
            VIEW_ZESTAWIENIE_FAKTUR_NOWETableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            reklamaTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
         
            //obiekty wykorzytywane przy wyszukiwaniu
            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);
           
            command = new SqlCommand();
            command.CommandType = CommandType.Text;
            command.Connection = conn;
            
            sqlDataAdapter = new SqlDataAdapter();

            //ustawia domyslny rok i miesiąc w pasku wyszukiwania
            rokToolStripTextBox.Text = DateTime.Today.Year.ToString();
            miesiacToolStripTextBox.Text = DateTime.Today.Month.ToString();

            wyszukajToolStrip.Items.Insert(10, new ToolStripLabel("nieuregulowane:"));
            wyszukajToolStrip.Items.Insert(11, new ToolStripControlHost(new CheckBox(), "zalegleCheckBox"));
            ((CheckBox)((ToolStripControlHost)wyszukajToolStrip.Items["zalegleCheckBox"]).Control).ThreeState = true;
            ((CheckBox)((ToolStripControlHost)wyszukajToolStrip.Items["zalegleCheckBox"]).Control).CheckState = CheckState.Indeterminate;

            PoznanKatowicetoolStripButton.Enabled = User.getUser().St_produkcja;
        }

        private void FacturesForm_Load(object sender, EventArgs e)
        {
            WindowState = FormWindowState.Maximized;

            DBBindings.bindujAgencje(agencjaToolStripComboBox);
         
            command.CommandText = query;
            sqlDataAdapter.SelectCommand = command;
        }
       
        private void wyszukajToolStripButton_Click(object sender, EventArgs e)
        {
            wyszukajToolStrip.Visible = wyszukajToolStrip.Visible ? false : true;
        }

        private void szukajToolStripButton_Click(object sender, EventArgs e)
        {
            command.CommandText = query;

            rEKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWE.Clear();

            command.CommandText += " where 1=1 ";

            command.Parameters.Clear();

            if (nrFakturyToolStripTextBox.Text.Trim() != "")
            {
                int i;
                if (!Int32.TryParse(nrFakturyToolStripTextBox.Text, out i))
                {
                    MessageBox.Show("Podaj prawidłowy numer faktury.");
                    return;
                }

                command.CommandText += " AND NUMER=@nr";
                command.Parameters.AddWithValue("@nr", nrFakturyToolStripTextBox.Text.Trim());
            }

            if (kodRozliczeniowyToolStripTextBox.Text.Trim() != "")
            {
                command.CommandText += " AND NR_FK like '%' + @kod + '%'";
                command.Parameters.AddWithValue("@kod", kodRozliczeniowyToolStripTextBox.Text.Trim());
            }

            if (rokToolStripTextBox.Text.Trim() != "")
            {
                int i;
                if (!Int32.TryParse(rokToolStripTextBox.Text.Trim(), out i))
                {
                    MessageBox.Show("Podaj prawidłowy rok.");
                    return;
                }

                command.CommandText += " AND YEAR(DATA_SPRZEDAZY)=@rok";
                command.Parameters.AddWithValue("@rok", rokToolStripTextBox.Text.Trim());
            }

            if (miesiacToolStripTextBox.Text.Trim() != "")
            {
                int i;
                if (!Int32.TryParse(miesiacToolStripTextBox.Text.Trim(), out i))
                {
                    MessageBox.Show("Podaj prawidłowy miesiąc.");
                    return;
                }

                command.CommandText += " AND MONTH(DATA_SPRZEDAZY)=@miesiac";
                command.Parameters.AddWithValue("@miesiac", miesiacToolStripTextBox.Text.Trim());
            }

            if (agencjaToolStripComboBox.Text.Trim() != "")
            {
                command.CommandText += " AND Agencja=@agencja";
                command.Parameters.AddWithValue("@agencja", agencjaToolStripComboBox.Text.Trim());
            }
            
            if (((CheckBox)((ToolStripControlHost)wyszukajToolStrip.Items["zalegleCheckBox"]).Control).CheckState == CheckState.Checked)
            {
                command.CommandText += " AND ((waluta_miano IS NOT NULL AND ROUND((waluta_brutto - wplata_waluta_brutto), 0) > 1)";
                command.CommandText += " OR (waluta_miano IS NULL AND ROUND((BRUTTO - suma_zaplat), 0) > 1))";
            }
            else if (((CheckBox)((ToolStripControlHost)wyszukajToolStrip.Items["zalegleCheckBox"]).Control).CheckState == CheckState.Unchecked)
            {
                command.CommandText += " AND ((waluta_miano IS NOT NULL AND ROUND((waluta_brutto - wplata_waluta_brutto), 0) <= 1)";
                command.CommandText += " OR (waluta_miano IS NULL AND ROUND((BRUTTO - suma_zaplat), 0) <= 1))";
            }

            if (!string.IsNullOrEmpty(cbSposobZaplaty.Text.Trim()))
            {
                command.CommandText += " AND SposobZaplaty=@sposobZaplaty";
                command.Parameters.AddWithValue("@sposobZaplaty", cbSposobZaplaty.Text.Trim());
            }
         
            sqlDataAdapter.SelectCommand = command;

            Cursor = Cursors.WaitCursor;

            try
            {
                sqlDataAdapter.Fill(rEKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWE);
                commandExecuted = true;
            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.Message);
            }

            Cursor = Cursors.Default;
        }

        private void kryteriumWyszukiwania_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                wyszukajToolStripButton.PerformClick();
            } 
        }

        /// <summary>
        /// Podsumowuje brutto i zaplate z wyswietlonych faktur
        /// </summary>
        private void podsumuj() {

            if (VIEW_ZESTAWIENIE_FAKTUR_NOWEBindingSource.List.Count != 0)
            {
            decimal brutto = Convert.ToDecimal(rEKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWE.Compute("Sum(BRUTTO)",""));
            decimal netto = Convert.ToDecimal(rEKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWE.Compute("Sum(netto)", ""));

            bruttoTextBox.Text = String.Format("{0:C}", brutto);
            nettoTextBox.Text = String.Format("{0:C}", netto);
            }
            else
            {
            bruttoTextBox.Clear();
            nettoTextBox.Clear();            
            }
        }

        private void zestawienieFakturBindingSource_ListChanged(object sender, ListChangedEventArgs e)
        {          
           podsumuj();
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            PrintDGV.Print_DataGridView(fakturyDataGridView,50);
        }

        private void wyczyscPolaToolStripButton_Click(object sender, EventArgs e)
        {
            rEKLAMADataSet.ZestawienieFaktur.Clear();

            nrFakturyToolStripTextBox.Clear();
            kodRozliczeniowyToolStripTextBox.Clear();
            rokToolStripTextBox.Clear();
            miesiacToolStripTextBox.Clear();
            agencjaToolStripComboBox.SelectedIndex = -1;
            agencjaToolStripComboBox.Text = "";
            ((CheckBox)((ToolStripControlHost)wyszukajToolStrip.Items["zalegleCheckBox"]).Control).CheckState = CheckState.Indeterminate;
            cbSposobZaplaty.SelectedIndex = -1;
            cbSposobZaplaty.Text = string.Empty;
        }

        private void podgladToolStripButton_Click(object sender, EventArgs e)
        {
            if (VIEW_ZESTAWIENIE_FAKTUR_NOWEBindingSource.Current != null)
            {
                DataRowView row = (DataRowView)VIEW_ZESTAWIENIE_FAKTUR_NOWEBindingSource.Current;
                REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow faktura = (REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow)row.Row;

                Cursor = Cursors.WaitCursor;
                FactureViewer fv = new FactureViewer(faktura.ID_FAKTURY,false);
                fv.ShowDialog();
                
                Cursor = Cursors.Default;
            }
        }

        /// <summary>
        /// Przechodzi do okna KLIENCI i wyświetla dane klienta związanego z  fakturą.
        /// </summary>
        private void klientToolStripButton_Click(object sender, EventArgs e)
        {
            if (VIEW_ZESTAWIENIE_FAKTUR_NOWEBindingSource.Current != null)
            {
                DataRowView row = (DataRowView)VIEW_ZESTAWIENIE_FAKTUR_NOWEBindingSource.Current;
                
                int custID = Convert.ToInt32(row["ID_NABYWCY"]);
                ClientsForm.getClientsForm((MDIBazaReklam)MdiParent).pokazKlienta(custID);

                Hide();

                ClientsForm.getClientsForm((MDIBazaReklam)MdiParent).Show();
            }   
        }

        private void FacturesForm_Shown(object sender, EventArgs e)
        {
            if (User.getUser().St_kierownik)
            {
                agencjaToolStripComboBox.Text = User.getUser().SymbolAgencji;
            }
            else if (User.getUser().St_handlowiec | User.getUser().St_subhandlowiec)
            {
                kodRozliczeniowyToolStripTextBox.Text = User.getUser().Kod_agenta;
            }
        }

        private void excelToolStripButton_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            ExcelHelper ex = new ExcelHelper();
            ex.Export(fakturyDataGridView);

            Cursor = Cursors.Default;
        }

        private void fakturyDataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (e.ListChangedType == ListChangedType.Reset)
            {
                foreach (DataGridViewRow r in fakturyDataGridView.Rows)
                {
                    DataRowView row = (DataRowView)r.DataBoundItem;
                    REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow
                    fakt = (REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow)
                    row.Row;

                    if (fakt.ilEmisji != fakt.ilPozycji)
                    {
                        r.DefaultCellStyle.ForeColor = Color.Crimson;
                    }
                    if (IsSumaEmisjiMniejszaOdFakturyNetto(fakt))
                    {
                        r.DefaultCellStyle.Font = new Font(fakturyDataGridView.DefaultCellStyle.Font, FontStyle.Bold);
                    }
                }
            }
        }

        private static bool IsSumaEmisjiMniejszaOdFakturyNetto(REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow faktura)
        {
            if (faktura.IssumaNettoZEmisjiNull()) return false;

            if (IsFakturaWWalucie(faktura) && !faktura.Iswaluta_kursNull())
                return Math.Round(faktura.sumaNettoZEmisji / faktura.waluta_kurs, 0) < (decimal)Math.Round(faktura.waluta_brutto, 0);

            return Math.Round(faktura.sumaNettoZEmisji, 0) < Math.Round(faktura.NETTO, 0); 
        }

        private static bool IsFakturaWWalucie(REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow faktura)
        {
            if (faktura.Iswaluta_mianoNull()) return false;
            if (string.IsNullOrEmpty(faktura.waluta_miano)) return false;
            if (faktura.waluta_miano.ToUpper() == "PLN") return false;

            return true;
        }

        private void wplata2toolStripButton_Click(object sender, EventArgs e)
        {
            if (VIEW_ZESTAWIENIE_FAKTUR_NOWEBindingSource.Current != null)
            {
                DataRowView row = (DataRowView)VIEW_ZESTAWIENIE_FAKTUR_NOWEBindingSource.Current;
                REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow f = (REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow)row.Row;

                PaymentForm2 pf2 = f.IsidWplatyNull() ? new PaymentForm2(0,f.ID_FAKTURY) : new PaymentForm2(f.idWplaty, f.ID_FAKTURY);

                if (pf2.ShowDialog() == DialogResult.OK)
                {
                    f.idWplaty = pf2.IdWplaty;
                    f.EndEdit();
                    fakturyDataGridView.Refresh();
                }
            }
    
        }

        private void zamowieniaToolStripButton_Click(object sender, EventArgs e)
        {
            if (VIEW_ZESTAWIENIE_FAKTUR_NOWEBindingSource.Current != null)
            {
                DataRowView row = (DataRowView)VIEW_ZESTAWIENIE_FAKTUR_NOWEBindingSource.Current;
                REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow f = (REKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWERow)row.Row;

                ZamowieniaForm zf = new ZamowieniaForm(f.ID_NABYWCY,f.idZamowienia);
                zf.ShowDialog();
            }
        }

        private void PoznanKatowicetoolStripButton_Click(object sender, EventArgs e)
        {
            FakturowaniePoznanKatowice fpk = new FakturowaniePoznanKatowice();
            fpk.ShowDialog();
        }

       
        private void odswiezToolStripButton_Click(object sender, EventArgs e)
        {
            if (commandExecuted)
            {
                Cursor = Cursors.WaitCursor;

                rEKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWE.Clear();
                sqlDataAdapter.Fill(rEKLAMADataSet.VIEW_ZESTAWIENIE_FAKTUR_NOWE);
                fakturyDataGridView.Refresh();

                Cursor = Cursors.Default;
            }
        }
    }
}