using System;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;
using Baza_Reklam.Classes.Helpers;
using Baza_Reklam.Classes.Interfaces;

namespace Baza_Reklam
{
    public partial class ZestawienieZamowienForm : Form, IForm
    {
        private const string query = "SELECT top 2000 * from VIEW_ZESTAWIENIE_ZAMOWIEN_NOWE ";

        private static ZestawienieZamowienForm form;
        private SqlCommand command;
        private SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();

        private bool commandExecuted;

        public static ZestawienieZamowienForm getZestawienieZamowienForm(MDIBazaReklam parent)
        {
            if (form == null){
                form = new ZestawienieZamowienForm(parent);
            }
            return form;
        }

        private ZestawienieZamowienForm(Form parent)
        {
            InitializeComponent();

            MdiParent = parent;

            //podmiana connstringa
            VIEW_ZESTAWIENIE_ZAMOWIEN_NOWETableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            reklamyZestawienieTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            
            //obiekty wykorzytywane przy wyszukiwaniu
            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);
           
            command = new SqlCommand(query,conn);
          
            //generuje piersze węzły w drzewie
            generateNodes();
       }

        private void FacturesForm_Load(object sender, EventArgs e)
        {
            WindowState = FormWindowState.Maximized;
            command.CommandText = query;
            sqlDataAdapter.SelectCommand = command;

            DBBindings.bindujAgencje(agencjaToolStripComboBox);
        }

        private void generateNodes()
        {
            TreeNode node = new TreeNode("Biura");
            node.Nodes.Add(new TreeNode());
            node.Name = "Biura";
            treeView1.Nodes.Add(node);

            command.Connection.Close();                         
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Node != null)
            {
                command.CommandText = query;
                command.Parameters.Clear();

                switch (e.Node.Level)
                {
                    case 0:
                        break;
                    case 1:
                        break;
                    case 2:
                        break;
                    case 3:
                        switch (e.Node.Parent.Parent.Parent.Name)
                        {
                            case "Biura":

                                Cursor = Cursors.WaitCursor;
                                
                                rEKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWE.Clear();
                                command.CommandText += " where agent=@agent";
                                command.Parameters.AddWithValue("@agent", e.Node.Name);
                                sqlDataAdapter.Fill(rEKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWE);
                                commandExecuted = true;
                                fakturyDataGridView.Refresh();

                                Cursor = Cursors.Default;

                                break;
                            default:
                                break;
                        }
                        break;
                    case 4:
                        break;
                    default:
                        break;
                }           
                }  
        }

        private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
        {
            TreeNode node;

            if (e.Node != null)
            {
               switch (e.Node.Level)
                {
                    case 0:
                        switch (e.Node.Name)
                        {
                            case "Biura":
                                DBBindings.dodajAgencjeDoWezla(e.Node);
                                break;
                        }  
                        break;
                    case 1:
                        switch (e.Node.Parent.Name)
                        {
                            case "Biura":
                                e.Node.Nodes.Clear();

                                node = new TreeNode("Agenci");
                                node.Name = "Agenci";
                                e.Node.Nodes.Add(node);
                                DBBindings.dodajAgentowDoWezla(node, e.Node.Name);
                                break;
                        }
                        break;
                    default:
                        break;
                }
            }
        }
       
        private void wyszukajToolStripButton_Click(object sender, EventArgs e)
        {
            wyszukajToolStrip.Visible = wyszukajToolStrip.Visible ? false : true;
        }


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

        private void wyczyscPolaToolStripButton_Click(object sender, EventArgs e)
        {
            nrZamToolStripTextBox.Clear();
            agencjaToolStripComboBox.SelectedIndex = -1;
            kodKlientaToolStripTextBox.Clear();
            rokToolStripTextBox.Clear();
            kodRozliczeniowyToolStripTextBox.Clear();
            txtMiesiac.Clear();
         }

        /// <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_ZAMOWIEN_NOWEBindingSource.Current != null)
            {
                DataRowView row = (DataRowView)VIEW_ZESTAWIENIE_ZAMOWIEN_NOWEBindingSource.Current;

                int custID = Convert.ToInt32(row["idKlienta"]);

                ClientsForm.getClientsForm((MDIBazaReklam)MdiParent).pokazKlienta(custID);

                Hide();

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

            }   
        }

        private void FacturesForm_Shown(object sender, EventArgs e)
        {
            rokToolStripTextBox.Text = DateTime.Today.Year.ToString();
          
            if (User.Instance().St_kierownik)
            {
               agencjaToolStripComboBox.Text = User.Instance().SymbolAgencji;
            }
            else if (User.Instance().St_handlowiec | User.Instance().St_subhandlowiec)
            {
               kodRozliczeniowyToolStripTextBox.Text = User.Instance().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 VIEW_ZESTAWIENIE_ZAMOWIEN_NOWEBindingSource_CurrentChanged(object sender, EventArgs e)
        {
            if (VIEW_ZESTAWIENIE_ZAMOWIEN_NOWEBindingSource.Current == null) return;
            
            DataRowView row = (DataRowView)VIEW_ZESTAWIENIE_ZAMOWIEN_NOWEBindingSource.Current;
            REKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWERow zam =
                (REKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWERow)row.Row;

            reklamyZestawienieTableAdapter.FillByIdZamowienia(
                rEKLAMADataSet.ReklamyZestawienie,zam.idZamowienia);

        }

        private void zamowieniaToolStripButton_Click(object sender, EventArgs e)
        {
            if (VIEW_ZESTAWIENIE_ZAMOWIEN_NOWEBindingSource.Current != null)
            {
                DataRowView row = (DataRowView)VIEW_ZESTAWIENIE_ZAMOWIEN_NOWEBindingSource.Current;

                REKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWERow zam =
                (REKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWERow)row.Row;

                ZamowieniaForm zf = new ZamowieniaForm(zam.idKlienta,zam.idZamowienia);
                zf.ShowDialog();
            }
        }

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

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

                Cursor = Cursors.Default;
            }
        }

        private void zamToolStripButton_Click(object sender, EventArgs e)
        {

            if (reklamyZestawienieBindingSource.Current != null)
            {
                DataRowView row = (DataRowView)reklamyZestawienieBindingSource.Current;

                if (row["reklamaId"] != DBNull.Value)
                {
                    int idRek = Convert.ToInt32(row["reklamaId"]);

                    OrderDetails.getOrderDetails().pokazSzczegolyZamowienia(idRek);
                    OrderDetails.getOrderDetails().ShowDialog();
                }
            }

        }

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

            rEKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWE.Clear();
            rEKLAMADataSet.ReklamyZestawienie.Clear();

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

            command.Parameters.Clear();

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

                command.CommandText += " AND nrZamowienia=@nr";
                command.Parameters.AddWithValue("@nr", nrZamToolStripTextBox.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 rokZamowienia=@rok";
                command.Parameters.AddWithValue("@rok", rokToolStripTextBox.Text.Trim());
            }

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

                command.CommandText += " AND (DATEPART(MONTH, data_od)=@ms OR DATEPART(MONTH, data_od_bez_FK)=@ms)";
                command.Parameters.AddWithValue("@ms", txtMiesiac.Text.Trim());
            }

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

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

            if (agencjaToolStripComboBox.Text.Trim() != "")
            {
                command.CommandText += " AND Agencja=@agencja";
                command.Parameters.AddWithValue("@agencja", agencjaToolStripComboBox.Text.Trim());
            }

            sqlDataAdapter.SelectCommand = command;

            Cursor = Cursors.WaitCursor;

            try
            {
                sqlDataAdapter.Fill(rEKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWE);
                commandExecuted = true;
            }
            finally
            {
                treeView1.CollapseAll();
                treeView1.SelectedNode = null;
                Cursor = Cursors.Default;
            }
        }

        private void podsumuj()
        {

            if (VIEW_ZESTAWIENIE_ZAMOWIEN_NOWEBindingSource.List.Count != 0)
            {
                decimal nettoZFV = Convert.ToDecimal(rEKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWE.Compute("Sum(nettoZafakturowane)", ""));
                decimal nettoBezFV = Convert.ToDecimal(rEKLAMADataSet.VIEW_ZESTAWIENIE_ZAMOWIEN_NOWE.Compute("Sum(DoZafakturowania)", ""));
                                
                wartoscNettoNiezafakturowanaTextBox.Text = String.Format("{0:C}", nettoBezFV);
                wartoscNettoZafakturowanaTextBox.Text = String.Format("{0:C}", nettoZFV);
            }
            else
            {
                wartoscNettoNiezafakturowanaTextBox.Clear();
                wartoscNettoZafakturowanaTextBox.Clear();
            }
        }

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

        private void fakturyDataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            foreach (DataGridViewRow row in fakturyDataGridView.Rows)
            {
                DataRowView r = (DataRowView)row.DataBoundItem;

                if (Convert.IsDBNull(r.Row["DoZafakturowania"])) continue;

                if (Convert.ToDouble(r.Row["Korekta"]) > 0.0)
                {
                    row.DefaultCellStyle.ForeColor = Color.Red;
                }
            }
        }

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

        public void CloseForm()
        {
            form = null;
        }
    }
}