using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Formatting;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace ZadaniaWPF.Model
{
    public class UsługaRest
    {
        const string url = "http://localhost:1520/";

        /*
        private static List<Zadanie> parsujXml(string s)
        {
            const string xmlNamespace = "http://schemas.datacontract.org/2004/07/ZadaniaWPF.Model";
            List<Zadanie> odczytaneZadania = new List<Zadanie>();

            XDocument xml = XDocument.Load(new System.IO.StringReader(s));
            IEnumerable<XElement> elementy = xml.Root.Elements();

            for (int i = 0; i < elementy.Count(); ++i)
            {
                XElement element = elementy.ElementAt(i);
                string opis = element.Element(
                    XName.Get("Opis", xmlNamespace)).Value;
                string sDataUtworzenia = element.Element(
                    XName.Get("DataUtworzenia", xmlNamespace)).Value;
                DateTime dataUtworzenia = DateTime.Parse(sDataUtworzenia);
                string sPlanowanyTerminRealizacji = element.Element(
                    XName.Get("PlanowanyTerminRealizacji", xmlNamespace)).Value;
                DateTime planowanyTerminRealizacji = DateTime.Parse(sPlanowanyTerminRealizacji);
                string sPriorytet = element.Element(
                    XName.Get("Priorytet", xmlNamespace)).Value;
                PriorytetZadania priorytet = (PriorytetZadania)Enum.Parse(typeof(PriorytetZadania), sPriorytet);
                string sCzyZrealizowane = element.Element(
                    XName.Get("CzyZrealizowane", xmlNamespace)).Value;
                bool czyZrealizowane = bool.Parse(sCzyZrealizowane);
                Zadanie zadanie = new Zadanie(opis, dataUtworzenia, planowanyTerminRealizacji, priorytet, czyZrealizowane);
                odczytaneZadania.Add(zadanie);
            }

            return odczytaneZadania;
        }
        */

        public static IEnumerable<Zadanie> CzytajWszystkie()
        {
            const string uri = "api/zadania/wszystkie";
            IEnumerable<Zadanie> zadania = null;

            using (HttpClient klient = new HttpClient())
            {
                klient.BaseAddress = new Uri(url);
                klient.DefaultRequestHeaders.Clear();
                klient.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/xml"));

                HttpResponseMessage odpowiedź = klient.GetAsync(uri).Result;
                if (odpowiedź.IsSuccessStatusCode)
                {
                    string daneOdpowiedzi = odpowiedź.Content.ReadAsStringAsync().Result;
                    //zadania = parsujXml(daneOdpowiedzi);

                    System.Runtime.Serialization.DataContractSerializer dcs = new System.Runtime.Serialization.DataContractSerializer(typeof(Zadanie[]));
                    System.IO.MemoryStream ms = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(daneOdpowiedzi));
                    zadania = (Zadanie[])dcs.ReadObject(ms);
                }
            }

            return zadania;
        }

        public static bool Dodaj(Zadanie zadanie)
        {
            const string uri = "api/zadania/dodaj";

            using (HttpClient klient = new HttpClient()) //powinno mieć metody set
            {
                klient.BaseAddress = new Uri(url);
                HttpResponseMessage odpowiedź = klient.PostAsJsonAsync<Zadanie>(uri, zadanie).Result;
                return odpowiedź.IsSuccessStatusCode;
            }
        }

        public static bool Usuń(int indeks)
        {
            const string uri = "api/zadania/usun/";

            using (HttpClient klient = new HttpClient()) //powinno mieć metody set
            {
                klient.BaseAddress = new Uri(url);
                HttpResponseMessage odpowiedź = klient.DeleteAsync(uri + indeks.ToString()).Result;
                return odpowiedź.IsSuccessStatusCode;
            }
        }

        /*
        public static bool Usuń(Zadanie zadanie)
        {
            const string uri = "api/zadania/usun";

            using (HttpClient klient = new HttpClient()) //powinno mieć metody set
            {
                klient.BaseAddress = new Uri(url);
                HttpResponseMessage odpowiedź = klient.PostAsJsonAsync<Zadanie>(uri, zadanie).Result;
                return odpowiedź.IsSuccessStatusCode;
            }
        }
        */

        public static bool Usuń(Zadanie zadanie)
        {
            const string uri = "api/zadania/usun";

            using (HttpClient klient = new HttpClient()) //powinno mieć metody set
            {
                klient.BaseAddress = new Uri(url);
                HttpRequestMessage żądanie = new HttpRequestMessage(HttpMethod.Delete, uri);
                żądanie.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(zadanie), Encoding.UTF8, "application/json");
                HttpResponseMessage odpowiedź = klient.SendAsync(żądanie).Result;
                return odpowiedź.IsSuccessStatusCode;
            }
        }
    }
}
