public string PutAllocationSlot(string barcodeNo, bool flag)//
        {
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                try
                {
                    ParkingSlotMaster recordRow = (from slot in context.ParkingSlotMasters
                                                   where slot.BarcodeNo == barcodeNo
                                                   select slot).SingleOrDefault();

                    recordRow.BarcodeNo = barcodeNo;
                    recordRow.IsOccupied = flag;

                    context.SaveChanges();
                    return recordRow.SlotName;
                }
                catch (Exception e)
                {
                    Console.Write(e);
                    return null;
                }

            }


        }
        public List<UserProfileModel> GetUserProfileList()
        {
            List<UserProfileModel> result = new List<UserProfileModel>();
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                var qry = context.UserProfiles.ToList();

                if (qry.Count() > 0)
                {
                    result = qry.Select(u => new UserProfileModel()
                    {
                        ActiveVehicleNumber = u.ActiveVehicleNumber,
                        Address1 = u.Address1,
                        Address2 = u.Address2,
                        City = u.City,
                        EmailID = u.EmailID,
                        FirstName = u.FirstName,
                        IsActive = u.IsActive,
                        LastName = u.LastName,
                        MobileNumber = u.MobileNumber,
                        Pincode = u.Pincode,
                        State = u.State,
                        UserID = u.UserID
                    }).ToList();
                }
            }
            return result;
        }
        public bool PostParking(ParkingMaster prk)
        {
            bool result = false;
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                ParkingMaster parking = new ParkingMaster()
                {
                    ParkingName = prk.ParkingName,
                    ParkingTemplateName = prk.ParkingTemplateName,
                    ParkingAddress = prk.ParkingAddress,
                    NumberOfSlots = prk.NumberOfSlots,
                    IsActive = prk.IsActive,

                    Min_Latitude=prk.Min_Latitude,
                    Max_Latitude=prk.Max_Latitude,
                    Min_Longitude=prk.Min_Longitude,
                    Max_Longitude = prk.Max_Longitude
                };

                context.ParkingMasters.Add(parking);
                context.SaveChanges();
                result = true;
            }
            return result;
        }
        public List<SelectedListModel> GetParkings()
        {
            List<SelectedListModel> result = new List<SelectedListModel>();
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                result = context.ParkingMasters.Where(s => s.IsActive == true).Select(s => new SelectedListModel { ListText = s.ParkingName, ListValue = s.ParkingID }).ToList();

                if (result.Count() > 0)
                    return result;
            }
            return result;
        }
 public int PostUserProfile(UserProfile entity)
 {
     using (_DBContext = new SmartParkingEntities())
     {
         UserProfile thisEntity = _DBContext.UserProfiles.Find(entity.UserID);
         if (thisEntity == null)
             CreateUserProfile(entity);
         else
             thisEntity = entity;
         _DBContext.SaveChanges();
     }
     return entity.UserID;
 }
 public UserProfileModel GetUserProfile(int inputId)
 {
     UserProfileModel result = new UserProfileModel();
     using (SmartParkingEntities context = new SmartParkingEntities())
     {
         var usr = context.UserProfiles.Where(u => u.UserID == inputId).SingleOrDefault();
         if (usr != null)
         {
             result = ConvertDBToModelObject(usr);
         }
     }
     return result;
 }
 public ParkingModel GetParkingMaster(int inputId)
 {
     ParkingModel result = new ParkingModel();
     using (SmartParkingEntities context = new SmartParkingEntities())
     {
         var prk = context.ParkingMasters.Where(u => u.ParkingID == inputId).SingleOrDefault();
         if (prk != null)
         {
             result = ConvertDBToModelObject(prk);
         }
     }
     return result;
 }
 public List<WalletTranModel> GetWalletTrans(int userID)
 {
     List<WalletTranModel> result = new List<WalletTranModel>();
     using (SmartParkingEntities context = new SmartParkingEntities())
     {
         result= context.WalletTrans.Where(e => e.UserID == userID).Select(e=> new WalletTranModel{ 
             Amount=e.Amount, 
             CRDR = e.CRDR,
             TransDt = e.TransDt
         }).ToList(); 
     }
     return result;
 }
        public SlotModel GetSlotByNumber(string inputId)
        {
            SlotModel result = new SlotModel();
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                var qry = context.SlotMasters.Where(s => s.SlotNumber == inputId).SingleOrDefault();

                if (qry != null)
                {
                    result = ConvertDBToModelObject(qry);
                }
            }
            return result;
        }
 public bool PostWalletTrans(WalletTran entity)
 {
     using (SmartParkingEntities DBContext = new SmartParkingEntities())
     {
         //UserProfile usr = DBContext.UserProfiles.Find(entity.UserID);
         //usr.WalletAmount = DBContext.WalletTrans.Where(e => e.UserID == entity.UserID && e.CRDR == "CR").Sum(e => e.Amount) -
         //    DBContext.WalletTrans.Where(e => e.UserID == entity.UserID && e.CRDR == "DR").Sum(e => e.Amount);
         //usr.WalletAmount += entity.CRDR == "CR" ? entity.Amount : -entity.Amount;
         entity.TransDt = DateTime.Now;
         DBContext.WalletTrans.Add(entity);
         DBContext.SaveChanges();
         return true;
     }
 }
        // GET api/values
        //public List<ParkingSlotMaster> Get()
        //{
        //    using (Smart_ParkingEntities1 context = new Smart_ParkingEntities1())
        //        {
        //            List<ParkingSlotMaster> list = (from ParkingSlot in context.ParkingSlotMasters
        //                       where ParkingSlot.IsActive==true
        //                        select ParkingSlot).ToList();
        //            return list;              
        //        }

        //}

        // GET api/values/5
        public ParkingSlotMaster Get(int inputId)
        {
            try
            {
                using (SmartParkingEntities context = new SmartParkingEntities())
                {
                    ParkingSlotMaster list = (from ParkingSlots in context.ParkingSlotMasters
                                              where ParkingSlots.ID == inputId
                                              select ParkingSlots).SingleOrDefault();
                    return list;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return new ParkingSlotMaster();
            }

        }
        public bool PostTransactionLog(ParkingSlotTransaction log)
        {
            bool result = false;
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                ParkingSlotTransaction transaction = new ParkingSlotTransaction()
                {
                    SlotID = log.SlotID,
                    UserID = log.UserID,
                    ParkingInTime = DateTime.Now,
                    VehicleNumber = log.VehicleNumber
                };

                context.ParkingSlotTransactions.Add(transaction);
                context.SaveChanges();
                result = true;
            }
            return result;
        }
        public List<SlotModel> GetSlots(int id)
        {
            List<SlotModel> result = new List<SlotModel>();
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                var qry = context.SlotMasters.Where(s => s.ParkingID == id).ToList();

                if (qry.Count() > 0)
                {
                    result = qry.Select(s => new SlotModel()
                    {
                        IsAcquired = s.IsAcquired,
                        IsActive = s.IsActive,
                        ParkingID = s.ParkingID,
                        SlotID = s.SlotID,
                        SlotNumber = s.SlotNumber
                    }).ToList();
                }
            }
            return result;
        }
        public List<ParkingModel> GetParkingMasterList()
        {
            List<ParkingModel> result = new List<ParkingModel>();
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                var qry = context.ParkingMasters.ToList();

                if (qry.Count() > 0)
                {
                    result = qry.Select(p => new ParkingModel()
                                {
                                    IsActive = p.IsActive,
                                    NumberOfSlots = p.NumberOfSlots,
                                    ParkingAddress = p.ParkingAddress,
                                    ParkingID = p.ParkingID,
                                    ParkingName = p.ParkingName,
                                    ParkingTemplateName = p.ParkingTemplateName
                                }).ToList();
                }
                return result;
            }
        }
        //vijay
        public List<string> GetOnlyOccupied()
        {
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                try
                {
                    var qry = (from listSlots in context.ParkingSlotMasters
                               where listSlots.IsOccupied == true
                               select listSlots.SlotName);

                    return qry.ToList();
                }
                catch (Exception e)
                {
                    Console.Write(e);
                    return new List<string>();
                }

            }


        }
 public List<SlotTransactionModel> GetSlotTransactionAsUser(int userId)
 {
     List<SlotTransactionModel> result = new List<SlotTransactionModel>();
     using (SmartParkingEntities context = new SmartParkingEntities())
     {
         result = (from pt in context.ParkingSlotTransactions
                   join s in context.SlotMasters on pt.SlotID equals s.SlotID
                   join p in context.ParkingMasters on s.ParkingID equals p.ParkingID
                   join u in context.UserProfiles on pt.UserID equals u.UserID
                   where pt.UserID == userId
                   select new SlotTransactionModel
                   {
                       TransactionID = pt.TransactionID,
                       SlotID = s.SlotID,
                       UserID = u.UserID,
                       UserName = u.FirstName + "" + u.LastName,
                       SlotName = s.SlotNumber,
                       ParkingInTime = pt.ParkingInTime,
                       ParkingName = p.ParkingName,
                       ParkingOutTime = pt.ParkingOutTime
                   }).ToList();
     }
     return result;
 }
        public bool PostUpdateUserProfile(UserProfileModel usr)
        {
            bool result = false;
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                UserProfile usrProfile = context.UserProfiles.Where(u => u.UserID == usr.UserID).SingleOrDefault();
                usrProfile.FirstName = usr.FirstName;
                usrProfile.LastName = usr.LastName;
                usrProfile.EmailID = usr.EmailID;
                usrProfile.MobileNumber = usr.MobileNumber;
                usrProfile.Address1 = usr.Address1;
                usrProfile.Address2 = usr.Address2;
                usrProfile.City = usr.City;
                usrProfile.State = usr.State;
                usrProfile.Pincode = usr.Pincode;
                usrProfile.ActiveVehicleNumber = usr.ActiveVehicleNumber;
                usrProfile.IsActive = usr.IsActive;

                context.SaveChanges();

                result = true;
            }
            return result;
        }
        public int PostUserProfile(UserProfileModel usr)
        {
            int result = 0;
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                UserProfile usrProfile = new UserProfile()
                {
                    FirstName = usr.FirstName,
                    LastName = usr.LastName,
                    EmailID = usr.EmailID,
                    MobileNumber = usr.MobileNumber,
                    Address1 = usr.Address1,
                    Address2 = usr.Address2,
                    City = usr.City,
                    State = usr.State,
                    Pincode = usr.Pincode,
                    ActiveVehicleNumber = usr.ActiveVehicleNumber,
                    IsActive = usr.IsActive
                };

                context.UserProfiles.Add(usrProfile);
                context.SaveChanges();
                result = usrProfile.UserID;
            }
            return result;
        }
 public int GetLastParkingSlot(int inputId)
 {
     int result = 0;
     using (SmartParkingEntities context = new SmartParkingEntities())
     {
         ParkingSlotTransaction trasaction = context.ParkingSlotTransactions.OrderByDescending(t => t.ParkingInTime).Where(t => t.UserID == inputId).FirstOrDefault();
         if (trasaction != null)
         {
             var slot = context.SlotMasters.Where(s => s.SlotID == trasaction.SlotID).SingleOrDefault();
             result = slot.ParkingID;
         }
     }
     return result;
 }
        public bool PostUpdateParkingSlotTransaction(string slotNumber, int userId, int parkingId)
        {
            bool result = false;
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                var getSolt = context.SlotMasters.Where(s => s.SlotNumber == slotNumber && s.ParkingID == parkingId).SingleOrDefault();
                if (getSolt != null)
                {
                    ParkingSlotTransaction transaction = context.ParkingSlotTransactions.Where(t => t.SlotID == getSolt.SlotID && t.UserID == userId).SingleOrDefault();
                    transaction.ParkingOutTime = DateTime.Now;

                    context.SaveChanges();
                    result = true;
                }
            }
            return result;
        }
        // DELETE api/values/5
        public bool Delete(int ID)
        {
            try
            {
                using (SmartParkingEntities context = new SmartParkingEntities())
                {
                    //ParkingSlotMaster OneSlot = (from slot in context.ParkingSlotMasters
                    //                             where slot.ID == ID
                    //                             select slot).FirstOrDefault();

                    //context.ParkingSlotMasters.Attach(OneSlot);
                    //context.ParkingSlotMasters.Remove(OneSlot);
                    //context.SaveChanges();
                    //return true;
                    ParkingSlotMaster OneSlot = new ParkingSlotMaster { ID = ID };
                    context.Entry(OneSlot).State = System.Data.EntityState.Deleted;
                    context.SaveChanges();
                    return true;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }
            //delete
        }
 public bool PostUpdateParking(ParkingMaster prk)
 {
     bool result = false;
     using (SmartParkingEntities context = new SmartParkingEntities())
     {
         ParkingMaster parking = context.ParkingMasters.Where(u => u.ParkingID == prk.ParkingID).SingleOrDefault();
         parking.IsActive = prk.IsActive;
         parking.NumberOfSlots = prk.NumberOfSlots;
         parking.ParkingAddress = prk.ParkingAddress;
         parking.ParkingName = prk.ParkingName;
         parking.ParkingTemplateName = prk.ParkingTemplateName;
         parking.IsActive = prk.IsActive;
         parking.Max_Latitude = prk.Max_Latitude;
         parking.Min_Latitude = prk.Min_Latitude;
         parking.Max_Longitude = prk.Max_Longitude;
         parking.Min_Longitude = prk.Min_Longitude;
         context.SaveChanges();
         result = true;
     }
     return result;
 }
        public List<ParkingModel> SearchParkingMaster(ParkingSearchModel model)
        {
            List<ParkingModel> result = new List<ParkingModel>();
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                var qry = context.ParkingMasters.Where(s => s.IsActive == true).ToList();

                if (model != null)
                {
                    if (model.ParkingName != null)
                        qry = qry.Where(p => p.ParkingName.Contains(model.ParkingName)).ToList();
                    if (model.ParkingAddress != null)
                        qry = qry.Where(p => p.ParkingAddress.Contains(model.ParkingAddress)).ToList();
                }

                if (qry.Count() > 0)
                {
                    result = qry.Select(p => new ParkingModel()
                    {
                        IsActive = p.IsActive,
                        NumberOfSlots = p.NumberOfSlots,
                        ParkingAddress = p.ParkingAddress,
                        ParkingID = p.ParkingID,
                        ParkingName = p.ParkingName,
                        ParkingTemplateName = p.ParkingTemplateName
                    }).ToList();
                }
                return result;
            }
        }
        public string PostParkUnPark(int userId, int parkingId, string slotNo, int SlotStatus)
        {
            bool result = false;
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                SlotMaster slot = context.SlotMasters.Where(s => s.ParkingID == parkingId && s.SlotNumber == slotNo).SingleOrDefault();
                if (SlotStatus == 2 || SlotStatus == 3)
                    slot.CurrentUserID = userId;
                else
                    slot.CurrentUserID = -1;
                if (slot.SlotStatus == 3 || SlotStatus == 3)
                {
                    if (SlotStatus == 3 && slot.SlotStatus == 1)
                        context.WalletTrans.Add(new WalletTran { UserID = userId, TransDt = DateTime.Now, CRDR = "DR", Amount = 20 });
                    if (SlotStatus == 1 && slot.SlotStatus == 3)
                        context.WalletTrans.Add(new WalletTran { UserID = userId, TransDt = DateTime.Now, CRDR = "CR", Amount = 20 });
                }
                slot.SlotStatus = SlotStatus;

                if (SlotStatus == 2 || SlotStatus == 3)
                {
                    ParkingSlotTransaction transaction = new ParkingSlotTransaction()
                    {
                        SlotID = slot.SlotID,
                        UserID = userId,
                        ParkingInTime = DateTime.Now,
                        VehicleNumber = null
                    };
                    context.ParkingSlotTransactions.Add(transaction);
                }
                else
                {
                    var getSolt = context.SlotMasters.Where(s => s.SlotNumber == slotNo && s.ParkingID == parkingId).SingleOrDefault();
                    if (getSolt != null)
                    {
                        ParkingSlotTransaction transaction = context.ParkingSlotTransactions.OrderByDescending(t => t.ParkingInTime).Where(t => t.SlotID == getSolt.SlotID && t.UserID == userId).FirstOrDefault();
                        transaction.ParkingOutTime = DateTime.Now;
                    }
                }

                context.SaveChanges();
                result = true;
            }
            //return result;
            return userId.ToString() + " " + parkingId.ToString() + " " + slotNo + " " + SlotStatus.ToString();
        }
        public string PostParkUnPark(int userId, int parkingId, string slotNo, bool isAcquired)
        {
            bool result = false;
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                SlotMaster slot = context.SlotMasters.Where(s => s.ParkingID == parkingId && s.SlotNumber == slotNo).SingleOrDefault();
                slot.IsAcquired = isAcquired;

                if (isAcquired)
                {
                    ParkingSlotTransaction transaction = new ParkingSlotTransaction()
                    {
                        SlotID = slot.SlotID,
                        UserID = userId,
                        ParkingInTime = DateTime.Now,
                        VehicleNumber = null
                    };
                    context.ParkingSlotTransactions.Add(transaction);
                }
                else
                {
                    var getSolt = context.SlotMasters.Where(s => s.SlotNumber == slotNo && s.ParkingID == parkingId).SingleOrDefault();
                    if (getSolt != null)
                    {
                        ParkingSlotTransaction transaction = context.ParkingSlotTransactions.OrderByDescending(t => t.ParkingInTime).Where(t => t.SlotID == getSolt.SlotID && t.UserID == userId).FirstOrDefault();
                        transaction.ParkingOutTime = DateTime.Now;
                    }
                }

                context.SaveChanges();
                result = true;
            }
            //return result;
            return userId.ToString() + " " + parkingId.ToString() + " " + slotNo + " " + isAcquired.ToString();
        }
        public bool PostSlotMaster(SlotModel slot)
        {
            bool result = false;
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                SlotMaster parlSlot = new SlotMaster()
                {
                    ParkingID = slot.ParkingID,
                    SlotNumber = slot.SlotNumber,
                    IsAcquired = slot.IsAcquired,
                    IsActive = slot.IsActive
                };

                context.SlotMasters.Add(parlSlot);
                context.SaveChanges();
                result = true;
            }
            return result;
        }
 public List<SelectedListModel> GetSearchParkingMaster(decimal  Latitude, decimal Longitude)
 {
     List<SelectedListModel> result = new List<SelectedListModel>();
     using (SmartParkingEntities context = new SmartParkingEntities())
     {
         var qry = context.ParkingMasters.Where(s => s.IsActive == true).ToList();
         qry = qry.Where(p => p.Min_Latitude <= Latitude && p.Max_Latitude >= Latitude && p.Min_Longitude <= Longitude && p.Max_Longitude >= Longitude).ToList();
         //if (model != null)
         //{
         //    if (model.Longitute.HasValue && model.Latitude.HasValue)
         //        qry = qry.Where(p => p.Min_Latitude <= model.Latitude.Value && p.Max_Latitude >= model.Latitude.Value && p.Min_Longitude <= model.Longitute.Value && p.Max_Longitude >= model.Longitute.Value).ToList();
         //    if (model.ParkingName != null)
         //        qry = qry.Where(p => p.ParkingName.Contains(model.ParkingName)).ToList();
         //    if (model.ParkingAddress != null)
         //        qry = qry.Where(p => p.ParkingAddress.Contains(model.ParkingAddress)).ToList();
         //}
         if (qry.Count() > 0)
         {
             result = qry.Select(p => new SelectedListModel()
             {
                 ListText = p.ParkingName, 
                 ListValue = p.ParkingID 
             }).ToList();
         }
         return result;
     }
 }
        public bool PostUpdateSlotMaster(SlotModel slot)
        {
            bool result = false;
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                SlotMaster updateSlot = context.SlotMasters.Where(s => s.ParkingID == slot.ParkingID && s.SlotID==slot.SlotID).SingleOrDefault();
                updateSlot.SlotNumber = slot.SlotNumber;
                updateSlot.IsActive = slot.IsActive;
                updateSlot.IsAcquired = slot.IsAcquired;

                context.SaveChanges();
                result = true;
            }
            return result;
        }
 public int GetWalletAmount(int userID)
 {
     using (SmartParkingEntities DBContext = new SmartParkingEntities())
     {
         UserProfile usr = DBContext.UserProfiles.Find(userID);
         usr.WalletAmount = DBContext.WalletTrans.Where(e => e.UserID == userID && e.CRDR == "CR").Sum(e => e.Amount).GetValueOrDefault(0)
         - DBContext.WalletTrans.Where(e => e.UserID == userID && e.CRDR == "DR").Sum(e => e.Amount).GetValueOrDefault(0);
         return usr.WalletAmount.GetValueOrDefault(0);
     }
 }
        public List<UserProfileModel> SearchUserProfile(UserSearchModel model)
        {
            List<UserProfileModel> result = new List<UserProfileModel>();
            using (SmartParkingEntities context = new SmartParkingEntities())
            {
                var qry = context.UserProfiles.Where(s => s.IsActive == true).ToList();

                if (model != null)
                {
                    if (model.UserName != null)
                        qry = qry.Where(u => u.FirstName.Contains(model.UserName)).ToList();
                    if (model.City != null)
                        qry = qry.Where(u => u.City.Contains(model.City)).ToList();
                    if (model.Email != null)
                        qry = qry.Where(u => u.EmailID.Contains(model.Email)).ToList();
                }

                if (qry.Count() > 0)
                {
                    result = qry.Select(u => new UserProfileModel()
                    {
                        ActiveVehicleNumber = u.ActiveVehicleNumber,
                        Address1 = u.Address1,
                        Address2 = u.Address2,
                        City = u.City,
                        EmailID = u.EmailID,
                        FirstName = u.FirstName,
                        IsActive = u.IsActive,
                        LastName = u.LastName,
                        MobileNumber = u.MobileNumber,
                        Pincode = u.Pincode,
                        State = u.State,
                        UserID = u.UserID
                    }).ToList();
                }
            }
            return result;
        }