using Database;
using KlassenBIB;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SanSystem
{
    public partial class frmObjekteList : Form
    {

        private List<Inspektionsobjekt> inspektionsobjekte;

        private void loadObjekte(string streetname)
        {
            dGObjekte.DataSource = null;
            inspektionsobjekte = Datenbank.Instance.loadedProjekt.Objekte.FindAll(x => x.StrasseName.Equals(streetname));
            
            dGObjekte.DataSource = inspektionsobjekte;            
        }

        private bool CheckEntries()
        {
            for(int i = 0; i < dGObjekte.Rows.Count; i++)
            {
                DataGridViewRow dgvw = dGObjekte.Rows[i];
                Inspektionsobjekt tmp = (Inspektionsobjekt)dgvw.DataBoundItem;
                if (tmp == null) continue;
                dgvw.DefaultCellStyle.BackColor = Color.White;

                int anzahlSan = tmp.Sanierung.Count;
                int anzahlfertig = 0;
                int counter = 0;
                foreach(Sanierung san in tmp.Sanierung)
                {
                    Sanieren _san = (san as Sanieren);
                    if (_san.Fertig) anzahlfertig++;
                    counter++;
                }
                if (counter != 0 && (anzahlfertig == anzahlSan))
                    dgvw.DefaultCellStyle.BackColor = Color.Green;
                if (
                       (tmp.BisPunkt== null || tmp.BisPunkt.Equals(""))
                    || (tmp.VonPunkt == null || tmp.VonPunkt.Equals(""))
                    || (tmp.Objektbezeichnung == null || tmp.Objektbezeichnung.Equals(""))
                    || tmp.Kanalrohrweite.Equals(0)
                ) dgvw.DefaultCellStyle.BackColor = Color.Olive;
                if(tmp.Projektnummer == null || tmp.Projektnummer.Equals("")) dgvw.DefaultCellStyle.BackColor = Color.Red;
                
            }
            return true;
        }
        
        public frmObjekteList(string streetname)
        {
            InitializeComponent();

            lbl_ort.Text = Global.Instance.language.Labels["ort"];
            lbl_projekt.Text = Global.Instance.language.Labels["projekt"];
            lbl_street.Text = Global.Instance.language.Labels["street"];
            btn_add.Text = Global.Instance.language.Labels["add_objekt"];


            gb_error_messages.Text = Global.Instance.language.Labels["error_messages"];
            lbl_grounddata.Text = Global.Instance.language.Labels["error_groundData"];
            lbl_projwrong.Text = Global.Instance.language.Labels["error_projwrong"];

            label1.BackColor = Color.Red;
            label5.BackColor = Color.Olive;

            loadObjekte(streetname);

            txt_strasse.Text = streetname;

            string fehlermeldung = string.Empty;
            // Prüfen nach Projektnummern
            List<string> projektnummern = inspektionsobjekte.Select(x => x.Projektnummer).Distinct().ToList();
            if(projektnummern.Count > 1) fehlermeldung = string.Format("{0}", Global.Instance.language.Fehlermeldungen["duplicate_projektnumber_in_street"]);

            // Prüfen nach Ortnamen
            List<string> ortnamen = inspektionsobjekte.Select(x => x.OrtName).Distinct().ToList();
            if (ortnamen.Count > 1) fehlermeldung = string.Format("{0}\n\n{1}",fehlermeldung,Global.Instance.language.Fehlermeldungen["difference_ortnames_in_street"]);

            if (!fehlermeldung.Equals(string.Empty)) MessageBox.Show(fehlermeldung, "Inhalt Fehler", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            if (projektnummern.Count > 1)
            {
                Dictionary<string, int> mayProNr = new Dictionary<string, int>();
                List<int> anzahle = new List<int>();
                foreach (string _prnr in projektnummern)
                {
                    int anzahl = inspektionsobjekte.Where(x => x.Projektnummer.Equals(_prnr)).Count();
                    mayProNr.Add(_prnr, anzahl);
                    anzahle.Add(anzahl);
                }

                int max = anzahle.Max();
                List<string> empProjNummer = new List<string>();
                foreach (KeyValuePair<string, int> kvp in mayProNr)
                {
                    if (kvp.Value.Equals(max)) empProjNummer.Add(kvp.Key);
                    else
                        continue;
                }
                if (empProjNummer.Count > 1) MessageBox.Show(Global.Instance.language.Fehlermeldungen["suggest_proj_nr_not_found"]);
                else
                    MessageBox.Show(string.Format("{0}\n{1}", Global.Instance.language.Fehlermeldungen["suggest_proj_nr"], empProjNummer.Last()));

                
            }

            txt_ort.Text = ortnamen.First();

            if (projektnummern.First() == null)
            {
                MessageBox.Show(Global.Instance.language.Fehlermeldungen["wrong_project_number"], "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            string[] vs = projektnummern.First().Split('-');
            if (vs.Length > 0)
                txt_pro_nr_1.Text = vs[0];
            if (vs.Length > 1)
                txt_pro_nr_2.Text = vs[1];
            if (vs.Length > 2)
                txt_pro_nr_3.Text = vs[2];

        }

        private void frmObjekteList_Load(object sender, EventArgs e)
        {
           
        }

        private void dGObjekte_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            
            DataGridView dataGridView = (DataGridView)sender;
            if (dataGridView == null) return;
            DataGridViewSelectedRowCollection dataGridViewRowsSelect = dataGridView.SelectedRows;
             

            if (dataGridViewRowsSelect.Count > 1) return;

            DataGridViewRow dgvr = dataGridViewRowsSelect[0];

            Inspektionsobjekt inspektionsobjekt = (Inspektionsobjekt)dgvr.DataBoundItem;
            if (inspektionsobjekt == null) return;

            frmObjektEdit frmObjektEdit = new frmObjektEdit(inspektionsobjekt);
            frmObjektEdit.MdiParent = this.MdiParent;
            frmObjektEdit.Show();
           
        }

        private void btn_add_Click(object sender, EventArgs e)
        {
            Inspektionsobjekt inspektionsobjekt = new Inspektionsobjekt();
            inspektionsobjekt.Projektnummer = inspektionsobjekte.First().Projektnummer;
            inspektionsobjekt.OrtName = inspektionsobjekte.First().OrtName;
            inspektionsobjekt.StrasseName = inspektionsobjekte.First().StrasseName;
            Datenbank.Instance.loadedProjekt.Objekte.Add(inspektionsobjekt);

            frmObjektEdit frmObjektEdit = new frmObjektEdit(inspektionsobjekt);
            frmObjektEdit.FormClosed += FrmObjektEdit_FormClosed;
            frmObjektEdit.ShowDialog();
        }

        private void FrmObjektEdit_FormClosed(object sender, FormClosedEventArgs e)
        {
            loadObjekte(txt_strasse.Text);
            CheckEntries();
        }

        private void dGObjekte_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            CheckEntries();
            dGObjekte.Columns["StrasseName"].Visible = false;
            dGObjekte.Columns["OrtName"].Visible = false;
            dGObjekte.Columns["Projektnummer"].Visible = false;
            dGObjekte.Columns["Rohrmaterial"].Visible = false;
            dGObjekte.Columns["Kanalrohrweite"].Visible = false;
            dGObjekte.Columns["Schachtlaenge"].Visible = false;
            dGObjekte.Columns["Objektbezeichnung"].Visible = false;
            dGObjekte.Columns["Haltunggemessen"].Visible = false;
            //dGObjekte.Columns["Sanierung"].Visible = false;
        }

        private void dGObjekte_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            CheckEntries();
        }
    }
}
