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;

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

        #region Typ var

        private void button1_Click(object sender, EventArgs e)
        {
            var i = 5;
            var l = 5L;
            var s = "Helion";
            var f = 1.0f;
            var d = 1.0;
            string nazwyTypow = "Zmienne i: " + i.GetType().FullName + "\n" +
                                "Zmienne l: " + l.GetType().FullName + "\n" +
                                "Zmienne s: " + s.GetType().FullName + "\n" +
                                "Zmienne f: " + f.GetType().FullName + "\n" + 
                                "Zmienne d: " + d.GetType().FullName + "\n";
            MessageBox.Show(nazwyTypow);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            var i = new[] {5,4,3,2,1,0};
            var l = new[] {5L,4L,3L,2L,1L,0L};
            var s = new[] {"Helion","Onepress","Sensus","Septem","Editio"};
            var f = new[] {1.0f,0.75f,0.5f,0.25f,0.0f};
            var d = new[] {1.0,0.75,0.5,0.25,0.0};
            string nazwyTypow = "Zmienne i: " + i.GetType().FullName + "\n" +
                                "Zmienne l: " + l.GetType().FullName + "\n" +
                                "Zmienne s: " + s.GetType().FullName + "\n" +
                                "Zmienne f: " + f.GetType().FullName + "\n" +
                                "Zmienne d: " + d.GetType().FullName + "\n";
            MessageBox.Show(nazwyTypow);
        }

        #endregion

        #region Wyrażenia Lambda

        delegate int DInc(int n);
        delegate bool DIsEqual(double x, double y);
        delegate void DShow(int n);
        
        private void button2_Click(object sender, EventArgs e)
        {
            //DInc Inc = delegate(int n) { return n + 1; };
            DInc Inc = (int n) => n + 1;            
            MessageBox.Show("Inc(1)=" + Inc(1));

            //DIsEqual IsEqual = delegate(double x, double y) { return (x == y); };
            //DIsEqual IsEqual = (x, y) => x == y;            
            int a = 10;
            int b = 20;
            MessageBox.Show("Czy równe a=" + a + " i b=" + b + "? " + (IsEqual(a, b) ? "Tak" : "Nie"));
            MessageBox.Show("Czy równe a=" + a + " i a=" + a + "? " + (IsEqual(a, a) ? "Tak" : "Nie"));

            //DShow Show = delegate(int n) { MessageBox.Show(n.ToString()); };
            DShow Show = n => { MessageBox.Show(n.ToString()); };            
            Show(10);

            string[] slowa = { "czereśnia", "jabłko", "borówka", "wiśnia", "jagoda" };
            //int dlugoscNajkrotszego = slowa.Min(delegate(string slowo) { return slowo.Length; });
            int dlugoscNajkrotszego = slowa.Min(slowo => slowo.Length);
            MessageBox.Show("Najkrótsze słowo ma " + dlugoscNajkrotszego + " liter.");
        }

        #endregion

        #region Metody rozszerzające 1

        private void button3_Click(object sender, EventArgs e)
        {
            MessageBox.Show("SQL Inje'c'tion".UsunApostrof());
            MessageBox.Show("SQL Inje'c'tion".UsunApostrof('#'));
            MessageBox.Show("SQL Inje'c'tion".UsunApostrof(c=>(c=='\'')?'#':c));
        }

        #endregion

        #region Nowa inicjacja obiektów

        class Klasa
        {
            public object pole1;
            public object pole2;
        }

        private void button5_Click(object sender, EventArgs e)
        {         
            Klasa k1 = new Klasa();
            k1.pole1 = "wartosc1";
            k1.pole2 = "wartość2";

            Klasa k2 = new Klasa { pole1 = "wartosc1", pole2 = "wartość2" };
        }

        private void button6_Click(object sender, EventArgs e)
        {
            List<string> lista = new List<string> { "Helion", "Onepress", "Sensus", "Septem", "Editio" };
            string s = "";
            foreach (string lancuch in lista.ToArray<string>()) s += lancuch+"\n";
            MessageBox.Show(s);
        }

        #endregion

        #region Typy anonimowe

        private void button7_Click(object sender, EventArgs e)
        {
            var anonim=new {i=1, l=1L, s="Helion", f=1.0f, d=1.0};
            MessageBox.Show(anonim.GetType().FullName);

            MessageBox.Show(anonim.s);
        }

        #endregion

        private void button8_Click(object sender, EventArgs e)
        {
            //Pobieranie danych
            string[] slowa = { "czereśnia", "jabłko", "borówka", "wiśnia", "jagoda" };            
            var szescioliterowe = from slowo in slowa where slowo.Length == 6 select slowo;
            //var szescioliterowe = slowa.Select(slowo => slowo).Where(slowo => slowo.Length == 6);
            //var szescioliterowe = Enumerable.Select(Enumerable.Where(slowa, slowo => slowo.Length == 6), slowo => slowo);
            //var szescioliterowe = Enumerable.Select(Enumerable.Where(slowa, delegate(string slowo) { return slowo.Length == 6; }), delegate(string slowo) { return slowo; });
                              
            string s = "Słowa sześcioliterowe:\n";
            foreach (string slowo in szescioliterowe) s += slowo + "\n";
            MessageBox.Show(s);

            int[] liczby = { 1, 2, 3, 5, 10 };
            var parzyste = from liczba in liczby where liczba/2.0==(int)liczba/2 select liczba;
            s = "Liczby parzyste:\n";
            foreach (int liczba in parzyste) s += liczba + "\n";
            MessageBox.Show(s);
        }
    }

    #region Metody rozszerzające 2

    delegate char DZmieniacz(char znak);

    static class Rozszerzenia
    {
        public static string UsunApostrof(this String argument)
        {
            return argument.Replace('\'', '#');
        }

        public static string UsunApostrof(this String argument, char zamiennik)
        {
            return argument.Replace('\'', zamiennik);
        }

        //public static string UsunApostrof(this String argument, DZmieniacz zmieniacz)
        public static string UsunApostrof(this String argument, Func<char,char> zmieniacz)
        {
            string wynik = "";
            foreach(char znak in argument.ToCharArray())
                wynik += zmieniacz(znak);
            return wynik;
        }        

        public static string TypJakoLancuch(this object argument)
        {
            return argument.GetType().FullName;
        }

        public static void ShowMessage(this object argument)
        {
            MessageBox.Show(argument.ToString());
        }
    }

    #endregion
}