using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using UMinho.GestaoProjectos.DataAccess;
using System.Data.Entity;

using UMinho.GestaoProjectos.Exceptions;
using System.Data.Objects.DataClasses;
using System.Text;
using UMinho.GestaoProjectos.Config;
using System.Drawing;
using System.Transactions;
using System.Linq.Expressions;
using System.Collections;


namespace UMinho.GestaoProjectos.BLL
{
    public class BLLListagemTimesheets
    {
         // public BLLListagemTimesheets() {}

 
        // Select implementado
         public List<ListagemTimesheet> GetAllFiles(int IDRecursoHumano = 0) ///filtros de pesquisa por investigador, include FKs
         {
             try
             {
                 using (GestaoProjectosEntities lt = new GestaoProjectosEntities())
                 {
                     var query = lt.ListagemTimesheets.Include("RecursoHumano").Include("EstadoTimesheet").AsQueryable();
                     if (IDRecursoHumano > 0)
                         query = query.Where(a => a.IDRecursoHumano == IDRecursoHumano);
                  
                     return query.ToList();
                 }
             }
             catch (Exception ex)
             {
                 //log.Error("BLL => GetAllFiles:" + ex.Message);
                 return new List<ListagemTimesheet>();
             }
         } 


         /// Alternativa (Seguindo o modelo da plataforma)
             public List<ListagemTimesheet> GetList(int? ID, int? IDRecursoHumano, DateTime? DataEnvio, string AssinaturaTimesheet,int? IDEstadoTimesheet, string Observações, string Ficheiro, string FileTipo, byte FileContent, string sortType, int maximumRows, int startRowIndex, string login)
        {
            using (GestaoProjectosEntities db = new GestaoProjectosEntities())
            {
                var entities = from e in db.ListagemTimesheets
                               select e;

                entities = GetQueryList(entities, ID, IDRecursoHumano, DataEnvio, AssinaturaTimesheet, IDEstadoTimesheet, Observações, Ficheiro, FileTipo, FileContent, login); 

                entities = GetListSort(entities.AsQueryable(), sortType); 

                entities.Skip(startRowIndex).Take(maximumRows);

                return entities.ToList();
            }
        }

        
             public int GetListCount(int? ID, int? IDRecursoHumano, DateTime? DataEnvio, string AssinaturaTimesheet,int? IDEstadoTimesheet, string Observações, string Ficheiro, string FileTipo, byte FileContent, string login)
             {
                 using (GestaoProjectosEntities db = new GestaoProjectosEntities())
                 {
                     var entities = from e in db.ListagemTimesheets
                                    select e;

                     return GetQueryList(entities, ID, IDRecursoHumano, DataEnvio, AssinaturaTimesheet, IDEstadoTimesheet, Observações, Ficheiro, FileTipo, FileContent, login).Count();
                 }
             }
        
        
             public IQueryable<ListagemTimesheet> GetQueryList(IQueryable<ListagemTimesheet> query, int? ID, int? IDRecursoHumano, DateTime? DataEnvio, string AssinaturaTimesheet, int? IDEstadoTimesheet, string Observações, string Ficheiro, string FileTipo, byte FileContent, string login)
             {
                 if (ID.HasValue)
                 {
                     query = query.Where(x => x.ID == ID.Value);
                 }
                 if (!String.IsNullOrEmpty(login))
                 {
                     query = query.Where(x => x.RecursoHumano.Login == login);
                 }
                 if (!string.IsNullOrEmpty(Ficheiro))
                 {
                     query = query.Where(x => x.Ficheiro.Contains(Ficheiro.Trim()));
                 }

                 return query;

             }
             private IQueryable<ListagemTimesheet> GetListSort(IQueryable<ListagemTimesheet> query, string sortType)
             {
                 bool sortDescending = false;
                 if (!string.IsNullOrEmpty(sortType))
                 {
                     string[] values = sortType.Split(' ');
                     sortType = values[0];
                     if (values.Length > 1)
                     {
                         sortDescending = values[1] == "DESC";
                     }
                 }
                 switch (sortType)
                 {
                     case "ID":
                         if (sortDescending)
                         {
                             query = query.OrderByDescending(p => p.ID);
                         }
                         else
                         {
                             query = query.OrderBy(p => p.ID);
                         }
                         break;
                     case "DataEnvio":
                         if (sortDescending)
                         {
                             query = query.OrderByDescending(p => p.DataEnvio);
                         }
                         else
                         {
                             query = query.OrderBy(p => p.DataEnvio);
                         }
                         break;
                 }

                 return query;
             }


             public List<ListagemTimesheet> GetAll(int? id, string login, string sortType, int maximumrows, int startRowIndex)
             {
                 return new GestaoProjectosEntities().ListagemTimesheets.OrderBy(p => p.ID).ToList();
             }

             

             public ListagemTimesheet GetEntity2(int id)
             {
                 return new GestaoProjectosEntities().ListagemTimesheets.Include("ListagemTimesheets").Include("RecursoHumano").SingleOrDefault(x => x.ID == id);
             }

          

             public List<ListagemTimesheet> GetTimesheet(int IDrecursohumano)
             {
                 return new GestaoProjectosEntities().ListagemTimesheets.Where(x => x.ID == IDrecursohumano).ToList();
             }

          


        //Download
        public ListagemTimesheet GetFileByID(int ID)
        {
            using (GestaoProjectosEntities lt = new GestaoProjectosEntities())
            {
                return lt.ListagemTimesheets.FirstOrDefault(a => a.ID == ID);
            }
        }


        // Save File - Insert
        public int SaveFile(ListagemTimesheet model)
        {
            try
            {
                using (GestaoProjectosEntities lt = new GestaoProjectosEntities())
                {
                    lt.ListagemTimesheets.AddObject(model);
                    lt.SaveChanges();
                    return model.ID;
                }
            }
            catch (Exception ex)
            {
                //log.Error("BLL => SaveFile:" + ex.Message);
                return 0;
            }
        }
         

        /// <summary>
        /// Update File
        /// </summary>
        /// <param name="model"></param>
        public void UpdateFile(ListagemTimesheet model)
        {
            try
            {
                using (GestaoProjectosEntities lt = new GestaoProjectosEntities())
                {
                    var result = lt.ListagemTimesheets.SingleOrDefault(b => b.ID == model.ID);
                    if (result != null)
                    {

                        
                        result.IDEstadoTimesheet = model.IDEstadoTimesheet;
                        result.FileContent = model.FileContent;
                        result.Ficheiro = model.Ficheiro;
                        result.DataEnvio = model.DataEnvio;
                        result.FileTipo = model.FileTipo;
                        result.AssinaturaTimesheet = model.AssinaturaTimesheet;
                        result.Observações = model.Observações;
                        lt.SaveChanges();
                    }
                }
            }
            catch (Exception ex)
            {
                //log.Error("BLL => UpdateFile:" + ex.Message);
            }
        }

        //Delete Funcional
        public void DeleteFile(int id)
        {
            try
            {
                using (GestaoProjectosEntities lt = new GestaoProjectosEntities())
                {
                    ListagemTimesheet dDelete = lt.ListagemTimesheets.FirstOrDefault(x => x.ID == id); //FirstOrdefault
                    lt.ListagemTimesheets.DeleteObject(dDelete);
                    lt.SaveChanges();
                }
            }
            catch (Exception ex)
            {
            }
        }


        //public void UpdateEntity(ListagemTimesheet e, string user)
        //{
        //    using (GestaoProjectosEntities db = new GestaoProjectosEntities())
        //    {
        //        object original = null;
        //        if (db.TryGetObjectByKey(e.EntityKey, out original))
        //        {
        //            db.ApplyCurrentValues(e.EntityKey.EntitySetName, e);
        //            BLLLogger.LogChanges<ListagemTimesheet>(db, e, user);
        //            db.SaveChanges();
        //        }
        //    }
        //}

        //public void SaveEntity(ListagemTimesheet e, string user)
        //{
        //    using (GestaoProjectosEntities db = new GestaoProjectosEntities())
        //    {

        //        db.ListagemTimesheets.AddObject(e);

        //        Logs log = BLLLogger.LogChanges<ListagemTimesheet>(db, e, user);
        //        db.SaveChanges();

        //        BLLLogger.SetKey<ListagemTimesheet>(db, e, log, user);
        //    }
        //}

        internal static void SaveObject()
        {
            //throw new NotImplementedException();
            
        }

        internal static void DeleteObject(int ID)
        {
            //throw new NotImplementedException();
            
        }
    }
}
