using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnivateProperties_API.Containers.Misc;
using UnivateProperties_API.Containers.Property;
using UnivateProperties_API.Context;
using UnivateProperties_API.Model.Misc;

namespace UnivateProperties_API.Repository.Misc
{
    public class CarouselRepository : ICarouselRepository
    {
        private readonly DataContext dBContext;

        public CarouselRepository(DataContext _dBContext)
        {
            dBContext = _dBContext;
        }

        public List<Carousel> Get(Func<Carousel, bool> where)
        {
            var CarouselList = dBContext.Carousel.Where(where).ToList();

            foreach (var item in CarouselList)
            {
                if (!string.IsNullOrEmpty(item.Image) && !item.Image.StartsWith("data:image"))
                    item.Image = ImageFormatter.ImageToBase64(item.Image);
            }

            return CarouselList;
        }

        public List<Carousel> GetAll()
        {            
            var CarouselList = dBContext.Carousel.ToList();

            foreach (var item in CarouselList)
            {
                if (!string.IsNullOrEmpty(item.Image) && !item.Image.StartsWith("data:image"))
                    item.Image = ImageFormatter.ImageToBase64(item.Image);
            }

            return CarouselList;
        }

        public Carousel GetDetailed(Func<Carousel, bool> first)
        {
            return dBContext.Carousel.FirstOrDefault(first);
        }

        public List<Carousel> GetDetailedAll()
        {
            return dBContext.Carousel.ToList();
        }

        public void Insert(Carousel item)
        {
            string image = item.Image;
            item.Image = "";
            dBContext.Add(item);
            Save();

            bool saveFiles = false;
            var loc = dBContext.Location.FirstOrDefault().PropertyImageLocation;
            var lastID = item.Id;
            item.Id = lastID;
            if (!string.IsNullOrEmpty(loc))
            {
                saveFiles = true;
                loc = loc.Replace("Properties", "Carousel");
                if (Directory.Exists(loc))
                {
                    Directory.CreateDirectory(loc);
                }
            }
            if (saveFiles)
            {
                string path = ImageFormatter.Base64ToImage(image, loc, lastID.ToString());
                item.Image = path;
            }

            Update(item);
            
        }

        public void Insert(IEnumerable<Carousel> items)
        {
            foreach (var item in items)
            {
                dBContext.Carousel.Add(item);
                Save();
            }
        }

        public void Remove(Carousel item)
        {
            dBContext.Carousel.Remove(item);
            Save();
        }

        public void Remove(IEnumerable<Carousel> items)
        {
            foreach (var item in items)
            {
                dBContext.Carousel.Remove(item);
                Save();
            }
        }

        public void RemoveAtId(int item)
        {
            var Carousel = Get(x => x.Id == item).FirstOrDefault();
            if (Carousel != null)
            {
                dBContext.Carousel.Remove(Carousel);
                Save();
            }
        }

        public void Save()
        {
            dBContext.SaveChanges();
        }

        public void Update(Carousel item)
        {
            dBContext.Entry(item).State = EntityState.Modified;
            Save();
        }

        public int NewId()
        {
            // Not sure if properties need it
            return 0;
        }

        public List<CarouselList> GetCarouselItems()
        {
            List<CarouselList> list = new List<CarouselList>();
            var CarouselList = dBContext.Carousel.ToList();

            foreach (var item in CarouselList)
            {                
                if (!string.IsNullOrEmpty(item.Image) && !item.Image.StartsWith("data:image"))
                    item.Image = ImageFormatter.ImageToBase64(item.Image);

                var carItem = new CarouselList()
                {
                    Id = item.Id,
                    Image = item.Image,
                    Header = item.Header
                };
                if (item.PropertyId > 0)
                {
                    var property = dBContext.Properties.Include("Province").Include("City").Include("Suburb").Where(p => p.Id == item.PropertyId).FirstOrDefault();
                    carItem.Address = string.Format("{0}, {1} <br/>{2}", property.Suburb.Description, property.City.Description, property.AddressLine3);
                    carItem.IsProperty = true;
                }
                if (item.TimeshareId > 0)
                {
                    var timeshare = dBContext.Weeks.Where(t => t.Id == item.TimeshareId).FirstOrDefault();
                    carItem.Bedrooms = timeshare.Bedrooms;
                    carItem.Sleeps = timeshare.MaxSleep;
                    carItem.Arrival = timeshare.ArrivalDate;
                    carItem.Departure = timeshare.DepartureDate;
                    carItem.IsProperty = false;
                }

                list.Add(carItem);
            }

            return list;
        }

        public CarouselList GetCarousel(int id)
        {
            var carousel = dBContext.Carousel.Where(c => c.Id == id).FirstOrDefault();

            CarouselList item = new CarouselList();
            if (carousel != null)
            {
                foreach (string prop in carousel.GetAllProperties())
                {
                    if (prop != "Item" && prop != "Display")
                        item[prop] = carousel[prop];
                }

                if (item.PropertyId > 0)
                {
                    var property = dBContext.Properties.Include("Province").Include("City").Include("Suburb").Where(p => p.Id == item.PropertyId).FirstOrDefault();
                    item.Address = string.Format("{0}, {1} <br/>{2}", property.Suburb.Description, property.City.Description, property.AddressLine3);
                    item.IsProperty = true;
                }
                if (item.TimeshareId > 0)
                {
                    var timeshare = dBContext.Weeks.Where(t => t.Id == item.TimeshareId).FirstOrDefault();
                    item.Bedrooms = timeshare.Bedrooms;
                    item.Sleeps = timeshare.MaxSleep;
                    item.Arrival = timeshare.ArrivalDate;
                    item.Departure = timeshare.DepartureDate;
                    item.IsProperty = false;
                }
            }

            return item;
        }
    }
}