using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Baza_Reklam.Classes.Model;

namespace Baza_Reklam
{
    public partial class KalendarzEmisji : Form
    {
        short emisjaDoZmiany;
        short? nowaEmisja;

        int iloscEmisji;
        int index = -1;
        string _tytul;

        NavigationColumn _dzial;
        NavigationSubColumn _rozdzial;
        bool _doDruku;

        private AdLocation _adLocation;


        //TODO: tu trzeba bedzie wymyslec cos lepszego
        DateTime dataOstatatniejZafakturowanejEmisji = DateTime.Parse("2008-12-30");
        REKLAMADataSet.REKLAMARow reklama;
        REKLAMADataSet.UKAZE_SIE_W_NRDataTable emisje;

        public short? NowaEmisja
        {
            get { return nowaEmisja; }
            set { nowaEmisja = value; }
        }

        public REKLAMADataSet.UKAZE_SIE_W_NRDataTable Emisje
        {
            get { return emisje; }
            set { emisje = value; }
        }


        public KalendarzEmisji(REKLAMADataSet.REKLAMARow reklama, REKLAMADataSet.UKAZE_SIE_W_NRDataTable emisje, NavigationColumn dzial, NavigationSubColumn rozdzial, AdLocation adLocation, bool doDruku)
        {
            _dzial = dzial;
            _rozdzial = rozdzial;
            _adLocation = adLocation;
            _doDruku = doDruku;

            InitForm(reklama, emisje, null);
            
            dodajButton.Click += dodajButton_Click;

            foreach (DataRow r in emisje.Rows)
            {
                if (r.RowState != DataRowState.Deleted)
                    iloscEmisji++;
            }

            label2.Text = iloscEmisji.ToString();
        }


        public KalendarzEmisji(REKLAMADataSet.REKLAMARow reklama, REKLAMADataSet.UKAZE_SIE_W_NRDataTable emisje, short emisjaDoZmiany)
        {
            InitForm(reklama, emisje, emisjaDoZmiany);

            dodajButton.Text = "Zmień";
            dodajButton.Click += zmienButton_Click;
        }

        private void InitForm(REKLAMADataSet.REKLAMARow reklamaRow, REKLAMADataSet.UKAZE_SIE_W_NRDataTable emisjeTable, short? issueNumerToChange)
        {
            InitializeComponent();

            reklama = reklamaRow;
            emisje = emisjeTable;

            _tytul = reklama.TYTUŁ;
            label1.Text = reklama.TYTUŁ;

            if(issueNumerToChange.HasValue)
                emisjaDoZmiany = issueNumerToChange.Value;
        }

        private void KalendarzEmisji_Load(object sender, EventArgs e)
        {
            nRTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            zamowieniaTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            DateTime startDay = DateTime.Today;

            nRTableAdapter.FillByTytulData(sLOWNIKDataSet.NR, _tytul, startDay);
                       
            short nr = Emisje.MaxZafakturowanyNrWydania();

            if (nr != 0)
                dataOstatatniejZafakturowanejEmisji = sLOWNIKDataSet.NR.dataWydania(_tytul, nr);

            nRDataGridView.CellValueChanged += nRDataGridView_CellValueChanged;
            nRDataGridView.CellContentClick += nRDataGridView_CellContentClicked;
        }

        private void dodajButton_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in nRDataGridView.Rows)
            {
                if (row.Cells[3].Value != null && ((bool)row.Cells[3].Value))
                {
                    if (row.DefaultCellStyle.BackColor == Color.LightYellow)
                    {
                        REKLAMADataSet.UKAZE_SIE_W_NRRow em =
                        emisje.NewUKAZE_SIE_W_NRRow();

                        em.ReklamaId = reklama.ReklamaID;
                        em.dataDodania = DateTime.Today;
                        em.Nr_Wydania = Convert.ToInt16(row.Cells[0].Value);
                        em.LokalizacjaId = _adLocation.Id;
                        em.Lokalizacja = _adLocation.Text;
                        if (_dzial != null)
                        {
                            em.DzialId = _dzial.Id;
                            em.Dzial = _dzial.Name;
                        }
                        if (_rozdzial != null)
                        {
                            em.RozdzialId = _rozdzial.Id;
                            em.Rozdzial = _rozdzial.Name;
                        }
                            
                        em.DoDruku = _doDruku;

                        emisje.AddUKAZE_SIE_W_NRRow(em);

                        if(!reklama.IsidZamowieniaNull())
                        {
                            //ustaw pole zafakturowanowszystko na false
                            REKLAMADataSet.zamowieniaDataTable zamowieniaDataTable = new REKLAMADataSet.zamowieniaDataTable();
                            zamowieniaTableAdapter.FillByIdZamowienia(zamowieniaDataTable, reklama.idZamowienia);
                            REKLAMADataSet.zamowieniaRow zamowieniaRow = (REKLAMADataSet.zamowieniaRow)zamowieniaDataTable.Rows[0];
                            zamowieniaRow.zafakturowanoWszystko = false;
                            zamowieniaRow.EndEdit();
                            zamowieniaTableAdapter.Update(zamowieniaRow);
                        }
                    }
                }
            }
        }

        private void zmienButton_Click(object sender, EventArgs e)
        {
            nowaEmisja = GetNewIssueNumber();
        }

        private short? GetNewIssueNumber()
        {
            short? newIssueNumer = null;
            bool? isIssueChecked;

            foreach (DataGridViewRow row in nRDataGridView.Rows)
            {
                if (row.ReadOnly || (row.DefaultCellStyle.BackColor != Color.White && row.DefaultCellStyle.BackColor != Color.LightYellow)) continue;

                isIssueChecked = (bool?)row.Cells[3].Value;
                if (!isIssueChecked.HasValue || !isIssueChecked.Value) continue;

                newIssueNumer = (short)row.Cells[0].Value;
                break;
            }

            return newIssueNumer;
        }

        private void nRDataGridView_CellContentClicked(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0) return;

            if (nRDataGridView.Rows[e.RowIndex].ReadOnly) return;

            if (e.ColumnIndex != 3) return;

            if (nRDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor == Color.White)
            {
                if (emisjaDoZmiany != 0 && index != -1)
                {
                    nRDataGridView.Rows[index].Cells[3].Value = false;
                    nRDataGridView.Rows[index].DefaultCellStyle.BackColor = Color.White;
                }

                nowaEmisja = (short) nRDataGridView.Rows[e.RowIndex].Cells[0].Value;
                index = e.RowIndex;

                nRDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightYellow;
            }
            else
            {
                nowaEmisja = (short) nRDataGridView.Rows[e.RowIndex].Cells[0].Value;
                index = e.RowIndex;

                nRDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
            }
            nRDataGridView.EndEdit();
        }

        private void nRDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex != 3) return;

            if (((bool) nRDataGridView[e.ColumnIndex, e.RowIndex].Value))
                iloscEmisji++;
            else
                iloscEmisji--;

            label2.Text = iloscEmisji.ToString();
        }

        private void nRDataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (e.ListChangedType != ListChangedType.Reset) return;

            foreach (DataGridViewRow row in nRDataGridView.Rows)
            {
                row.DefaultCellStyle.BackColor = Color.White;

                row.Cells[2].Value = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames
                    [(int) Convert.ToDateTime(row.Cells[1].Value).DayOfWeek];

                DataRow[] table = emisje.Select("[Nr Wydania]=" + row.Cells[0].Value);

                if (table != null && table.Length > 0)
                {
                    row.ReadOnly = true;
                    row.Cells[3].Value = true;
                    row.DefaultCellStyle.BackColor = Color.WhiteSmoke;

                    REKLAMADataSet.UKAZE_SIE_W_NRRow em =
                        (REKLAMADataSet.UKAZE_SIE_W_NRRow) table[0];

                    if (Convert.ToDateTime(row.Cells[1].Value) < DateTime.Today)
                    {
                        row.DefaultCellStyle.BackColor = Color.MintCream;
                    }
                    else
                    {
                        if (em.zafakturowana)
                        {
                            row.DefaultCellStyle.BackColor = Color.LightGray;
                        }

                        //anulowana
                        if (em.status == 2)
                        {
                            row.DefaultCellStyle.ForeColor = Color.Red;
                        }

                        if (emisjaDoZmiany == (short) row.Cells[0].Value)
                        {
                            row.DefaultCellStyle.BackColor = Color.MistyRose;
                        }
                    }
                }
                else if (emisjaDoZmiany == 0)
                {
                    //emisja nie została wcześniej wybrana, ale jej misiąc już
                    // jest zafakturowany
                    DateTime dataWydania = (DateTime) row.Cells[1].Value;
                    if (dataWydania.Year <= dataOstatatniejZafakturowanejEmisji.Year
                        &&
                        dataWydania.Month <= dataOstatatniejZafakturowanejEmisji.Month)
                    {
                        row.ReadOnly = true;
                        row.DefaultCellStyle.BackColor = Color.LightGray;
                    }
                }
            }
        }
    }
}