using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Data.Linq.Mapping; //atrubuty klasy encji
using System.Data.Linq; //DataContext

namespace LINQ_to_SQL
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [Table(Name = "ListaOsob")]
        public class Osoba
        {
            [Column(Name = "Id", IsPrimaryKey = true)]
            public int Id;
            [Column(Name = "Imię", CanBeNull = false)]
            public string Imię;
            [Column(Name = "Nazwisko", CanBeNull = false)]
            public string Nazwisko;
            [Column]
            public int NumerTelefonu;
            [Column]
            public int Wiek;
        }

        static string nazwaPliku = "Telefony.mdf";
        static DataContext bazaDanychTelefony =
           new DataContext(System.IO.Path.GetFullPath(nazwaPliku));
        static Table<Osoba> listaOsob = bazaDanychTelefony.GetTable<Osoba>();

        private void button0_Click(object sender, EventArgs e)
        {
            //pobieranie kolekcji
            var listaOsobPelnoletnich = from osoba in listaOsob select osoba;

            //wyświetlanie pobranej kolekcji
            string s = "Lista osób:\n";
            foreach (Osoba osoba in listaOsobPelnoletnich) s += osoba.Imię + " " + osoba.Nazwisko + " (" + osoba.Wiek + ")\n";
            MessageBox.Show(s);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //pobieranie kolekcji
            var listaOsobPelnoletnich = from osoba in listaOsob
                                        where osoba.Wiek >= 18
                                        select osoba;

            //wyświetlanie pobranej kolekcji
            string s = "Lista osób pełnoletnich:\n";
            foreach (Osoba osoba in listaOsobPelnoletnich) s += osoba.Imię + " " + osoba.Nazwisko + " (" + osoba.Wiek + ")\n";
            MessageBox.Show(s);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //pobieranie kolekcji
            var listaOsobDoZmianyWieku = from osoba in listaOsob
                                         where (osoba.Wiek < 18 || !osoba.Imię.EndsWith("a"))
                                         select osoba;

            //wyświetlanie pobranej kolekcji
            string s = " Lista osób niebędących pełnoletnimi kobietami:\n";
            foreach (Osoba osoba in listaOsobDoZmianyWieku) s += osoba.Imię + " " + osoba.Nazwisko + " (" + osoba.Wiek + ")\n";
            MessageBox.Show(s);

            //modyfikowanie kolekcji
            foreach (Osoba osoba in listaOsobDoZmianyWieku) osoba.Wiek++;

            //wyświetlanie pełnej listy osób kolekcji po zmianie
            s = "Lista wszystkich osób:\n";
            foreach (Osoba osoba in listaOsob) s += osoba.Imię + " " + osoba.Nazwisko + " (" + osoba.Wiek + ")\n";
            MessageBox.Show(s);

            //zapisywanie zmian
            bazaDanychTelefony.SubmitChanges();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //dodawanie osoby do tabeli
            int noweId = listaOsob.Max(osoba => osoba.Id) + 1;
            MessageBox.Show("Nowe Id: " + noweId);
            Osoba noworodek = new Osoba { Id = noweId, Imię = "Nela", Nazwisko = "Matulewska", NumerTelefonu = 0, Wiek = 0 };
            listaOsob.InsertOnSubmit(noworodek);

            //zapisywanie zmian
            bazaDanychTelefony.SubmitChanges(); //dodawany jest także nowy rekord

            //wyświetlanie tabeli
            string s = "Lista osób:\n";
            foreach (Osoba osoba in listaOsob) s += osoba.Imię + " " + osoba.Nazwisko + " (" + osoba.Wiek + ")\n";
            MessageBox.Show(s);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            //wybieranie elementów do usunięcia i ich oznaczanie
            IEnumerable<Osoba> doSkasowania = from osoba in listaOsob
                                              where osoba.Imię == "Nela"
                                              select osoba;
            listaOsob.DeleteAllOnSubmit(doSkasowania);

            //zapisywanie zmian
            bazaDanychTelefony.SubmitChanges();

            //wyświetlanie tabeli
            string s = "Lista osób:\n";
            foreach (Osoba osoba in listaOsob) s += osoba.Imię + " " + osoba.Nazwisko + " (" + osoba.Wiek + ")\n";
            MessageBox.Show(s);
        }
    }
}
