using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using System.Drawing.Printing;
using Baza_Reklam.Classes.Helpers;
using Baza_Reklam.Classes.Model;
using Baza_Reklam.Classes.Repositories;


namespace Baza_Reklam
{
    public partial class ProjectForm : Form
    {

        protected int ReklamaId;
        protected int ProjektId;
        private readonly bool _pro;

        public ProjectForm(int reklamaId)
        {
            InitializeComponent();
            ReklamaId = reklamaId;
            InitReklama();
        }

        public ProjectForm(int reklamaId, int projektId)
        {
            InitializeComponent();
            ReklamaId = reklamaId;
            ProjektId = projektId;
            _pro = true;
            InitReklama();
        }

        protected REKLAMADataSet.PRODUKCJARow Projekt
        {
            get
            {
                if (pRODUKCJABindingSource.Current == null) return null;

                return (REKLAMADataSet.PRODUKCJARow)((DataRowView)pRODUKCJABindingSource.Current).Row;
            }
        }

        protected REKLAMADataSet.REKLAMARow Reklama
        {
            get
            {
                if (rEKLAMADataSet.REKLAMA.Rows.Count > 0)
                    return (REKLAMADataSet.REKLAMARow)rEKLAMADataSet.REKLAMA.Rows[0];
                return null;
            }
        }

        private Section _section;
        private List<Module> _modules;


        protected Section Section
        {
            get { return _section;  }
            set { _section = value; }
        }

        private void InitReklama()
        {
            pRODUKCJATableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            reklamaTableAdapter1.Connection.ConnectionString = ConnString.getConnString().Value;

            reklamaTableAdapter1.FillByReklamaId(rEKLAMADataSet.REKLAMA, ReklamaId); 
        }

        private void ProjectForm_Load(object sender, EventArgs e)
        {
            ToolTip toolTip = new ToolTip();
            toolTip.ShowAlways = true;
            toolTip.SetToolTip(btnOpenFolder, "Otwórz folder z materiałami");

            EnableControls(!AdHelper.IsOgloszenie(Reklama));
            if (AdHelper.IsOgloszenie(Reklama))
            {
                tYP_PROJEKTUComboBox.Items.Clear();
                tYP_PROJEKTUComboBox.Items.AddRange(new string[] { "Nowy", "W produkcji", "Gotowy" });
            }

            if (Reklama != null && Reklama.TYTUŁ.ToUpper() != "EXPO")
            {
                jezykComboBox.Visible = false;
                label1.Visible = false;
            }
            jezykComboBox.SelectedIndex = 0;

            rEKLAMADataSet.PRODUKCJA.Clear();
            pRODUKCJATableAdapter.FillByReklamaId(rEKLAMADataSet.PRODUKCJA, ReklamaId);
            pRODUKCJABindingSource.DataSource = rEKLAMADataSet;

            if (pRODUKCJABindingSource.List.Count == 0)
            {
                DodajNowyProjekt(ReklamaId);
            }

            if (_pro)
            {
                while (Convert.ToInt32(((DataRowView) pRODUKCJABindingSource.Current)["ID"]) != ProjektId)
                {
                    pRODUKCJABindingSource.MoveNext();
                }
            }
            else
            {
                pRODUKCJABindingSource.MoveLast();
            }
        }

        private void EnableControls(bool enabled)
        {

            List<Control> controls = new List<Control>();
            controls.Add(szerTextBox);
            controls.Add(wysTextBox);
            controls.Add(lokalizacjaTextBox);
            controls.Add(path_to_materialTextBox);
            controls.Add(btnOpenFolder);

            foreach (Control control in controls)
            {
                control.Enabled = enabled;
                if (control is TextBox)
                    control.BackColor = enabled ? Color.White : Color.Gray;
        }
        }

        public void DodajNowyProjekt(int reklamaId)
        {
           // this.ReklamaId = reklamaId;
             
            REKLAMADataSet.REKLAMARow row = rEKLAMADataSet.REKLAMA.FindByReklamaID(ReklamaId);

            DataView datatable = (DataView)pRODUKCJABindingSource.List;
            
            DataRowView row2 = datatable.AddNew();                       
                      
            //dane z zamowienia
            row2["NAZWA_ZAMOWIENIA"] = row["Id reklamy"];
            row2["moduł"] = row["MOD_TYP"];
            row2["Type"] = AdHelper.GetProjectType(row["TYTUŁ"].ToString(), row["MOD_TYP"].ToString());
            row2["reklamaId"] = ReklamaId;
            row2["szer"] = row["SZER"];
            row2["wys"] = row["WYS"];
            row2["kolor"] = row["KOLOR"];
            row2["lokalizacja"] = row["strona"];
            row2["dataemisji"] = PierwszaEmisja(ReklamaId);
            row2["AGENT"] = User.Instance().Login;
            row2["DATA_AGENT"] = DateTime.Now;

            if (DateTime.Today.DayOfWeek == DayOfWeek.Thursday)
            {
                row2["ZAMAWIAM_NA"] = DateTime.Today.AddDays(4);
            }
            else if (DateTime.Today.DayOfWeek == DayOfWeek.Friday)
            {
                row2["ZAMAWIAM_NA"] = DateTime.Today.AddDays(3);
            }
            else
            {
                row2["ZAMAWIAM_NA"] = DateTime.Today.AddDays(2);
            }
           
            dodajButton.Enabled = true;

            pRODUKCJABindingSource.EndEdit();
            pRODUKCJABindingSource.MoveLast();

        }

        private void dodajButton_Click(object sender, EventArgs e)
        {
            pRODUKCJABindingSource.EndEdit();
            pRODUKCJATableAdapter.Update(rEKLAMADataSet.PRODUKCJA);
            
            Close();
        }

        /// <summary>
        /// Blokuje pola w zależności od stanu i uprawnień.
        /// </summary>
        private void pRODUKCJABindingSource_CurrentChanged(object sender, EventArgs e)
        {
            REKLAMADataSet.PRODUKCJARow projekt = Projekt;
            if (projekt == null || projekt.ID == 0) return;

            wymiaryLabel.Text = GetAdSize();


            if (projekt.STAN == "ZAMAWIAM")
            {
                dodajButton.Enabled = true;
                tYP_PROJEKTUComboBox.Enabled = true;
                zAMAWIAM_NADateTimePicker.Enabled = true;
                pRIORYTETComboBox.Enabled = true;

                oPISTextBox.ReadOnly = false;
                uwagiTextBox.ReadOnly = false;
                path_to_materialTextBox.ReadOnly = false;
                dataEmisjiTextBox.ReadOnly = false;
                lokalizacjaTextBox.ReadOnly = false;
                path_to_materialTextBox.ReadOnly = false;

                usunButton.Enabled = (!string.IsNullOrEmpty(User.Instance().Symbol_agenta) && User.Instance().Symbol_agenta.ToLower() == projekt.AGENT.ToLower()) || User.Instance().IsProdukcja || User.Instance().IsDtp;
            }
            else
            {
                dodajButton.Enabled = false || User.Instance().IsProdukcja || User.Instance().IsDtp;
                tYP_PROJEKTUComboBox.Enabled = false || User.Instance().IsProdukcja || User.Instance().IsDtp;
                zAMAWIAM_NADateTimePicker.Enabled = false || User.Instance().IsProdukcja || User.Instance().IsDtp;
                pRIORYTETComboBox.Enabled = false || User.Instance().IsProdukcja || User.Instance().IsDtp;
                
                lokalizacjaTextBox.ReadOnly = true && !User.Instance().IsProdukcja;
                oPISTextBox.ReadOnly = true && !User.Instance().IsProdukcja;
                uwagiTextBox.ReadOnly = true && !User.Instance().IsProdukcja;
                path_to_materialTextBox.ReadOnly = true && !User.Instance().IsProdukcja;
                dataEmisjiTextBox.ReadOnly = true && !User.Instance().IsProdukcja;

                usunButton.Enabled = User.Instance().IsKierownik;
            }

        }

        private string GetAdSize()
        {
            if (_section == null || _section.Id != Reklama.GRZBIET || _modules == null || _modules.Count == 0)
            {
                SectionRepository sectionRepository = new SectionRepository(ConnString.getConnString().Value);
                _section = sectionRepository.Find(Reklama.GRZBIET);
                _modules = sectionRepository.FindModulesBySection(_section);
            }
            Module module = _modules.Find(delegate(Module m) { return m.Name == Reklama.MOD_TYP; });

            AdSize adSize = AdHelper.GetAdSize(Convert.ToInt32(Reklama.SZER), Convert.ToInt32(Reklama.WYS), module);
            return adSize.Width + " x " + adSize.Height;
        }

        private void anulujButton_Click(object sender, EventArgs e)
        {
            Close();
        }

        /// <summary>
        /// Wyszukuje nr pierwszej emisji...
        /// </summary>
        private static int PierwszaEmisja(int reklamaId)
        {
            SqlConnection conn = new SqlConnection(ConnString.getConnString().Value);

            SqlCommand command = new SqlCommand();
            command.CommandType = CommandType.Text;
            command.CommandText = "SELECT MIN([Nr Wydania]) FROM dbo.[UKAŻE SIĘ W NR] WHERE ReklamaId=@param";
            command.Parameters.AddWithValue("@param", reklamaId);
            command.Connection = conn;

            conn.Open();
            try
            {
                object nrWydania = command.ExecuteScalar();
                
                if (nrWydania is DBNull) return 0;
                
                return Convert.ToInt32(nrWydania);
            }
            finally
            {
                conn.Close();    
            }
        }
              
        private void drukujProjektButton_Click(object sender, EventArgs e)
        {            
            if (printDialog.ShowDialog() == DialogResult.OK)
            {
                printDoc.PrinterSettings = printDialog.PrinterSettings;
                printDoc.PrintPage += Renderuj2;
                printDoc.Print();    
            }
        }

        /// <summary>
        /// Przerysowuje kontrolkę na wydruk.
        /// </summary>
        private void Renderuj2(object sender, PrintPageEventArgs ev)
        {            
            int leftMargin = ev.MarginBounds.Left;
            int topMargin = ev.MarginBounds.Left;
            
            ev.Graphics.DrawRectangle(new Pen(Color.Gray), leftMargin, topMargin, Width, Height);

            foreach (Control c in Controls) {
                
                string controlType = c.GetType().ToString().Substring(c.GetType().ToString().LastIndexOf(".") + 1);
                
                switch (controlType) { 
                    case "TextBox":
                        TextBox t = (TextBox)c;
                        ev.Graphics.DrawRectangle(new Pen(Color.Gray), t.Left + leftMargin, t.Top + topMargin, t.Width, t.Height);
                        ev.Graphics.DrawString(t.Text, t.Font, new SolidBrush(t.ForeColor), new RectangleF(t.Left + leftMargin + 2, t.Top + topMargin + 1, t.Width + 2, t.Height - 2), new StringFormat());
                        break;
                    case "Label":
                        Label l = (Label)c;
                        ev.Graphics.DrawString(l.Text, l.Font, new SolidBrush(l.ForeColor), l.Left + leftMargin, l.Top + topMargin + l.Height / 2 - ev.Graphics.MeasureString("a", l.Font).Height / 2, new StringFormat());
                        break;
                    case "ComboBox":
                        ComboBox cb = (ComboBox)c;
                        ev.Graphics.DrawRectangle(new Pen(Color.LightGray), cb.Left + leftMargin, cb.Top + topMargin, cb.Width, cb.Height);
                        ev.Graphics.DrawString(cb.Text, cb.Font, new SolidBrush(cb.ForeColor), cb.Left + leftMargin + 2, cb.Top + topMargin+ cb.Height / 2 - ev.Graphics.MeasureString("a", cb.Font).Height / 2, new StringFormat());
                        break;
                    case "DateTimePicker":
                        DateTimePicker dp = (DateTimePicker)c;
                        ev.Graphics.DrawRectangle(new Pen(Color.LightGray), dp.Left + leftMargin, dp.Top + topMargin, dp.Width, dp.Height);
                        ev.Graphics.DrawString(dp.Text, dp.Font, new SolidBrush(dp.ForeColor), dp.Left + leftMargin + 2, dp.Top + topMargin + dp.Height / 2 - ev.Graphics.MeasureString("a", dp.Font).Height / 2, new StringFormat());
                        break;
                    default:
                        break;
                }
            }
        }

        private void dodajNowyButton_Click(object sender, EventArgs e)
        {
            DodajNowyProjekt(ReklamaId);
        }

        private void usunButton_Click(object sender, EventArgs e)
        {
            pRODUKCJABindingSource.RemoveCurrent();
        }

        private void modułComboBox_SelectedValueChanged(object sender, EventArgs e)
        {
            pRODUKCJABindingSource.EndEdit();
            DataRowView row = (DataRowView)pRODUKCJABindingSource.Current;
            row["moduł"] = row["moduł"];
            pRODUKCJABindingSource.EndEdit();
        }

        private void zAMAWIAM_NADateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            if (zAMAWIAM_NADateTimePicker.Value.DayOfWeek == DayOfWeek.Saturday)
            {
                zAMAWIAM_NADateTimePicker.Value = zAMAWIAM_NADateTimePicker.Value.AddDays(-1);
                MessageBox.Show("WEEKEND! Wybierz inny dzień");
                return;
            }

            if (zAMAWIAM_NADateTimePicker.Value.DayOfWeek == DayOfWeek.Sunday)
            {
                zAMAWIAM_NADateTimePicker.Value = zAMAWIAM_NADateTimePicker.Value.AddDays(-2);
                MessageBox.Show("WEEKEND! Wybierz inny dzień");
                return;
            }
       
        }

        private void btnOpenFolder_Click(object sender, EventArgs e)
        {
            string path = path_to_materialTextBox.Text.Trim();

            if (string.IsNullOrEmpty(path)) return;

            if (!Directory.Exists(path))
            {
                MessageBox.Show("Nie znalazłem ścieżki: " + path, "Projekt - materiały do reklamy");
                return;
            }
            System.Diagnostics.Process.Start(path);
        }
    }
}