public NewsModel()
 {
     using (var db=new DatabaseModel())
     {
         Articles = db.article.OrderByDescending(a=>a.AddedDateTime).ToList();
     }
 }
 public ReserveModel()
 {
     using (var db=new DatabaseModel())
     {
         Beds = db.bed.ToList();
         Rooms = db.room.ToList();
     }
     
 }
 public HeaderAuthPartialModel(string email)
 {
     using (var db = new DatabaseModel())
     {
         int clientId = db.client.First(cl => cl.Email == email).Id;
         var client=db.client.First(c => c.Id == clientId);
         Email = client.Email;
         FirstName = client.FirstName;
     }
 }
 public ActionResult Article(int id)
 {
     using (var db = new DatabaseModel())
     {
         List<article> model = new List<article>
         {
             db.article.FirstOrDefault(a => a.Id == id)
         };
         return View(model);
     }
 }
 public ActionResult About()
 {
     using (var db = new DatabaseModel())
     {
         List<article> model = new List<article>
         {
             db.article.FirstOrDefault(a => a.Alias == "About")
         };
         return View("Article", model);
     }
 }
 private ActionResult Article(string alias)
 {
     using (var db = new DatabaseModel())
     {
         List<article> model = new List<article>
         {
             db.article.FirstOrDefault(a => a.Alias == alias)
         };
         return View(model);
     }
 }
 public MyOrderModel(order_room orderRoom)
 {
     StartDate = orderRoom.StartDate;
     EndDate = orderRoom.EndDate;
     using (var db = new DatabaseModel())
     {
         var room = db.room.First(r => r.Id == orderRoom.RoomId);
         RoomNumber = room.Number;
         Floor = room.Floor;
     }
     _type = "room";
 }
 public IndexModel()
 {
     using (var db = new DatabaseModel())
     {
         Comments = db.comment.ToList();
         Comments = Comments.Select(c =>
         {
             if (c.ClientId != null)
                 c.Name = c.client.FirstName;
             return c;
         }).ToList();
     }
 }
        public MyOrderModel(order_bed orderBed)
        {
            StartDate = orderBed.StartDate;
            EndDate = orderBed.EndDate;
            using (var db = new DatabaseModel())
            {
                var bed = db.bed.First(r => r.Id == orderBed.BedId);
                var room = db.room.First(r => r.Id == bed.RoomId);
                RoomNumber = room.Number;
                Floor = room.Floor;
            }
            _type = "bed";

        }
        public static string Authorize(string password, string email)
        {
            using (var db = new DatabaseModel())
            {
                var client =
                    db.client.FirstOrDefault(c => c.Email == email && c.Password == password);

                bool clientExists = client != null;
                if (!clientExists)
                    return "notFound";
                var identity = new GenericIdentity(client.Email);
                HttpContext.Current.User = new GenericPrincipal(identity, new[] {"client"});
                FormsAuthentication.SetAuthCookie(client.Email, false);
                return "";

            }
        }
 public static string Register(client client)
 {
     string result;
     using (var db = new DatabaseModel())
     {
         if (db.client.Any(c => c.Email.ToLower() == client.Email.ToLower()))
         {
             result = "userExists";
         }
         else
         {
             db.client.Add(client);
             db.SaveChanges();
             result = "";
         }
     }
     return result;
 }
        public ActionResult ReserveBed(int[] bedsId, string startDate, string endDate)
        {
            JsonResult result;

            if (AuthProvider.IsAuthorized)
            {
                int clientId = AuthProvider.ClientId;
                DateTime startDateTime = DateTime.Parse(startDate);
                DateTime endDateTime = DateTime.Parse(endDate);
                int daysCount = (endDateTime - startDateTime).Days;
                using (var db = new DatabaseModel())
                {
                    var trans = db.Database.BeginTransaction();
                    try
                    {
                        var beds = db.bed.Where(r => bedsId.Contains(r.Id)).ToList();
                        check check = new check
                        {
                            ClientId = clientId,
                            CreatedDate = DateTime.Now,
                            Sum = beds.Sum(r => r.Price*daysCount),
                            Pawn=0
                        };
                        db.check.Add(check);
                        db.SaveChanges();
                        foreach (var id in bedsId)
                        {
                            db.order_bed.Add(new order_bed
                            {
                                ClientId = db.client.First(cl => cl.Email == HttpContext.User.Identity.Name).Id,
                                StartDate = startDateTime,
                                EndDate = endDateTime,
                                BedId = id,
                                CheckId = check.Id
                            });
                        }
                        db.SaveChanges();
                        trans.Commit();

                        result = new JsonResult
                        {
                            JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                            Data = new
                            {
                                success = true
                            }
                        };
                    }
                    catch (Exception e)
                    {
                        trans.Rollback();
                        result = new JsonResult
                        {
                            JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                            Data = new
                            {
                                success = false,
                                errorReason = "unknown"
                            }
                        };
                    }
                    return result;
                }
            }
            result = new JsonResult
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new
                {
                    success = false,
                    errorReason = "notAuthorized",
                    html = PartialView("_AuthModalPartial").RenderToString()
                }
            };
            return result;
        }
        public ActionResult FindBedInDateRange(string startDate,string endDate)
        {
            try
            {
                DateTime startDateTime = DateTime.Parse(startDate);
                DateTime endDateTime = DateTime.Parse(endDate);
                using (var db = new DatabaseModel())
                {
                    var ordersRoom = (
                        from orderRoom in db.order_room

                        where
                             (((orderRoom.StartDate <= startDateTime) && (startDateTime < orderRoom.EndDate)) ||
                               ((orderRoom.StartDate < endDateTime) && (endDateTime <= orderRoom.EndDate)))
                        select orderRoom).ToList();

                    var ordersBed = (
                        from orderBed in db.order_bed
                        where
                             (((orderBed.StartDate <= startDateTime) && (startDateTime < orderBed.EndDate)) ||
                               ((orderBed.StartDate < endDateTime) && (endDateTime <= orderBed.EndDate)))
                        select orderBed).ToList();

                    var orderBedIds = ordersBed.Select(ob => ob.BedId).ToList();
                    var orderRoomIds = ordersRoom.Select(or => or.RoomId).ToList();

                    var freeBeds = (
                        from b in db.bed
                        where
                            ((!orderBedIds.Contains(b.Id)) &&
                             (!orderRoomIds.Contains(b.RoomId)))
                        select b
                        ).ToList();


                    var rooms = db.room.ToList();
                    var model = new ReserveModel
                    {
                        Rooms = rooms,
                        Beds = freeBeds
                    };
                    return new JsonResult
                    {
                        Data = new
                        {
                            success = true,
                            html = PartialView("_FoundBedPartial", model).RenderToString()
                        }
                    };
                }
            }
            catch (Exception e)
            {
                return new JsonResult
                {
                    Data = new
                    {
                        success = false                    
                    }
                };
            }
        }
        public ActionResult FindRoomInDateRange(string startDate, string endDate)
        {
            try
            {
                DateTime startDateTime = DateTime.Parse(startDate);
                DateTime endDateTime = DateTime.Parse(endDate);
                using (var db = new DatabaseModel())
                {
                    var ordersRoom = (
                        from orderRoom in db.order_room
                        where
                            (((orderRoom.StartDate <= startDateTime) && (startDateTime < orderRoom.EndDate)) ||
                             ((orderRoom.StartDate < endDateTime) && (endDateTime <= orderRoom.EndDate)))
                        select orderRoom);

                    var ordersBed = (
                        from orderBed in db.order_bed
                        where
                            (((orderBed.StartDate <= startDateTime) && (startDateTime < orderBed.EndDate)) ||
                             ((orderBed.StartDate < endDateTime) && (endDateTime <= orderBed.EndDate)))
                        select orderBed);

                    List<int> reservedRooms =
                        ordersRoom.Select(or => or.RoomId)
                            .Union(db.bed.Where(b => ordersBed.Any(ob => ob.BedId == b.Id)).Select(b => b.RoomId))
                            .ToList();
                        
                        /*(from orderBed in ordersBed
                        from orderRoom in ordersRoom
                        from bed in db.bed
                        from room in db.room
                        where
                            (((bed.RoomId == room.Id) &&
                              (orderBed.BedId == bed.Id)) ||
                             (orderRoom.RoomId == room.Id))
                        select room.Id
                        ).ToList();*/
                    var rooms = db.room.Where(r => !reservedRooms.Contains(r.Id)).ToList();

                    var beds = (from r in rooms
                        from b in db.bed
                        where (b.RoomId == r.Id)
                        select b
                        ).Distinct().ToList();

                    var model = new ReserveModel
                    {
                        Rooms = rooms,
                        Beds = beds
                    };
                    return new JsonResult
                    {
                        Data = new
                        {
                            success = true,
                            html = PartialView("_FoundRoomPartial", model).RenderToString()
                        }
                    };
                }
            }
            catch (Exception e)
            {
                return new JsonResult
                {
                    Data = new
                    {
                        success = false                   
                    }
                };
            }
        }
        public SimpleReserveModel(string type, int personsCount, DateTime inDate, DateTime outDate)
        {
            if(inDate>outDate)
                throw new Exception("Некорректно указаны даты");
            if(type.IsNullOrWhiteSpace())
                throw new Exception("Некорректные данные");
            using (var db = new DatabaseModel())
            {
                Type = type == "room" ? ReserveType.Room : ReserveType.Bed;
                if (Type == ReserveType.Room)
                {
                    var ordersRoom = (
                        from orderRoom in db.order_room
                        where
                            (((orderRoom.StartDate <= inDate) && (inDate < orderRoom.EndDate)) ||
                             ((orderRoom.StartDate < outDate) && (outDate <= orderRoom.EndDate)))
                        select orderRoom);

                    var ordersBed = (
                        from orderBed in db.order_bed
                        where
                            (((orderBed.StartDate <= inDate) && (inDate < orderBed.EndDate)) ||
                             ((orderBed.StartDate < outDate) && (outDate <= orderBed.EndDate)))
                        select orderBed);

                    List<int> reservedRooms =
                        ordersRoom.Select(or => or.RoomId)
                            .Union(db.bed.Where(b => ordersBed.Any(ob => ob.BedId == b.Id)).Select(b => b.RoomId))
                            .ToList();
                    Rooms =
                        db.room.Where(r => (!reservedRooms.Contains(r.Id)) && (r.bed.Count >= personsCount)).ToList();
                    Beds = db.bed.ToList();
                }
                else
                {
                    var ordersRoom = (
                        from orderRoom in db.order_room

                        where
                             (((orderRoom.StartDate <= inDate) && (inDate < orderRoom.EndDate)) ||
                               ((orderRoom.StartDate < outDate) && (outDate <= orderRoom.EndDate)))
                        select orderRoom).ToList();

                    var ordersBed = (
                        from orderBed in db.order_bed
                        where
                             (((orderBed.StartDate <= inDate) && (inDate < orderBed.EndDate)) ||
                               ((orderBed.StartDate < outDate) && (outDate <= orderBed.EndDate)))
                        select orderBed).ToList();

                    var orderBedIds = ordersBed.Select(ob => ob.BedId).ToList();
                    var orderRoomIds = ordersRoom.Select(or => or.RoomId).ToList();

                    Beds = (
                        from b in db.bed
                        where
                            ((!orderBedIds.Contains(b.Id)) &&
                             (!orderRoomIds.Contains(b.RoomId)))
                        select b
                        ).ToList();
                    Rooms = db.room.ToList();
                }
                OutDate = outDate;
                InDate = inDate;
            }
        }
 public ActionResult MyOrders()
 {
     if (!AuthProvider.IsAuthorized)
     {
         RedirectToAction("Index", "Home");
     }
     var model = new List<MyOrderModel>();
     using (var db=new DatabaseModel())
     {
         foreach (var order in db.order_bed.Where(ob => ob.ClientId == AuthProvider.ClientId))
         {
             model.Add(new MyOrderModel(order));
         }
         foreach (var order in db.order_room.Where(ob => ob.ClientId == AuthProvider.ClientId))
         {
             model.Add(new MyOrderModel(order));
         }
     }
     return View(model);
 }
 public ActionResult AddComment(CommentModel model)
 {
     if((!AuthProvider.IsAuthorized)&&model.Name.IsNullOrWhiteSpace())
         throw new Exception("Не удалось добавить комментарий");
     using (var db=new DatabaseModel())
     {
         db.comment.Add(new comment
         {
             ClientId = AuthProvider.IsAuthorized ? (int?) AuthProvider.ClientId : null,
             Name = model.Name,
             Text = model.Message
         });
         db.SaveChanges();
     }
     return new JsonResult{Data = true, JsonRequestBehavior = JsonRequestBehavior.DenyGet};
 }