2023-05-19 19:25:28 +04:00
using HotelBusinessLogic.MailWorker ;
using HotelContracts.BindingModels ;
2023-04-07 00:34:27 +04:00
using HotelContracts.BusinessLogicsContracts ;
using HotelContracts.SearchModels ;
using HotelContracts.StoragesContracts ;
using HotelContracts.ViewModels ;
2023-05-18 00:23:52 +04:00
using HotelDataModels.Models ;
2023-04-07 00:34:27 +04:00
using Microsoft.Extensions.Logging ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.Threading.Tasks ;
namespace HotelBusinessLogic.BusinessLogics
{
public class ConferenceBookingLogic : IConferenceBookingLogic
{
private readonly ILogger _logger ;
private readonly IConferenceBookingStorage _conferenceBookingStorage ;
2023-05-19 19:25:28 +04:00
private readonly AbstractMailWorker _mailWorker ;
private readonly IHeadwaiterLogic _headwaiterLogic ;
2023-04-07 00:34:27 +04:00
2023-05-19 19:25:28 +04:00
public ConferenceBookingLogic ( ILogger < ConferenceBookingLogic > logger , IConferenceBookingStorage conferenceBookingStorage , IHeadwaiterLogic headwaiterLogic , AbstractMailWorker mailWorker )
2023-04-07 00:34:27 +04:00
{
_logger = logger ;
_conferenceBookingStorage = conferenceBookingStorage ;
2023-05-19 19:25:28 +04:00
_mailWorker = mailWorker ;
_headwaiterLogic = headwaiterLogic ;
2023-04-07 00:34:27 +04:00
}
2023-05-18 00:23:52 +04:00
public bool AddDinnerToConferenceBooking ( ConferenceBookingSearchModel model , IDinnerModel dinner )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
_logger . LogInformation ( "AddDinnerToConferenceBooking. NameHall:{NameHall}.Id:{ Id}" , model . NameHall , model . Id ) ;
var element = _conferenceBookingStorage . GetElement ( model ) ;
if ( element = = null )
{
_logger . LogWarning ( "AddDinnerToConferenceBooking element not found" ) ;
return false ;
}
_logger . LogInformation ( "AddDinnerToConferenceBooking find. Id:{Id}" , element . Id ) ;
element . ConferenceBookingDinners [ dinner . Id ] = dinner ;
_conferenceBookingStorage . Update ( new ( )
{
Id = element . Id ,
NameHall = element . NameHall ,
2023-05-19 14:03:41 +04:00
BookingDate = element . BookingDate ,
2023-05-18 00:23:52 +04:00
ConferenceId = element . ConferenceId ,
HeadwaiterId = element . HeadwaiterId ,
ConferenceBookingDinners = element . ConferenceBookingDinners
} ) ;
return true ;
}
2023-04-07 00:34:27 +04:00
public bool Create ( ConferenceBookingBindingModel model )
{
CheckModel ( model ) ;
2023-05-18 00:23:52 +04:00
model . ConferenceBookingDinners = new ( ) ;
2023-04-07 00:34:27 +04:00
2023-05-19 19:25:28 +04:00
var result = _conferenceBookingStorage . Insert ( model ) ;
if ( result = = null )
2023-04-07 00:34:27 +04:00
{
_logger . LogWarning ( "Insert operation failed" ) ;
return false ;
}
2023-05-19 19:25:28 +04:00
SendConferenceBookingMessage ( result . HeadwaiterId , $"Гостиница \" Р а з в и т и е \ ", План питания №{result.Id}" , $"План питания №{result.Id} под названием {result.NameHall} и стоимостью {result.BookingDate} добавлен" ) ;
2023-04-07 00:34:27 +04:00
return true ;
}
public bool Delete ( ConferenceBookingBindingModel model )
{
CheckModel ( model , false ) ;
_logger . LogInformation ( "Delete. Id:{Id}" , model . Id ) ;
2023-05-19 19:25:28 +04:00
var result = _conferenceBookingStorage . Delete ( model ) ;
if ( result = = null )
2023-04-07 00:34:27 +04:00
{
_logger . LogWarning ( "Delete operation failed" ) ;
return false ;
}
2023-05-19 19:25:28 +04:00
SendConferenceBookingMessage ( result . HeadwaiterId , $"Гостиница \" Р а з в и т и е \ ", План питания №{result.Id}" , $"План питания №{result.Id} под названием {result.NameHall} и стоимостью {result.BookingDate} удален" ) ;
2023-04-07 00:34:27 +04:00
return true ;
}
public ConferenceBookingViewModel ? ReadElement ( ConferenceBookingSearchModel model )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
_logger . LogInformation ( "ReadElement. Id:{Id}" , model . Id ) ;
var element = _conferenceBookingStorage . GetElement ( model ) ;
if ( element = = null )
{
_logger . LogWarning ( "ReadElement element not found" ) ;
return null ;
}
_logger . LogInformation ( "ReadElement find. Id:{Id}" , element . Id ) ;
return element ;
}
public List < ConferenceBookingViewModel > ? ReadList ( ConferenceBookingSearchModel ? model )
{
_logger . LogInformation ( "ReadList. Id:{ Id}" , model ? . Id ) ;
var list = model = = null ? _conferenceBookingStorage . GetFullList ( ) : _conferenceBookingStorage . GetFilteredList ( model ) ;
if ( list = = null )
{
_logger . LogWarning ( "ReadList return null list" ) ;
return null ;
}
_logger . LogInformation ( "ReadList. Count:{Count}" , list . Count ) ;
return list ;
}
public bool Update ( ConferenceBookingBindingModel model )
{
CheckModel ( model ) ;
if ( _conferenceBookingStorage . Update ( model ) = = null )
{
_logger . LogWarning ( "Update operation failed" ) ;
return false ;
}
return true ;
}
private void CheckModel ( ConferenceBookingBindingModel model , bool withParams = true )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
if ( ! withParams )
{
return ;
}
2023-05-18 00:23:52 +04:00
if ( string . IsNullOrEmpty ( model . NameHall ) )
{
throw new ArgumentNullException ( "Нет названия конференции" , nameof ( model . NameHall ) ) ;
}
2023-04-07 00:34:27 +04:00
_logger . LogInformation ( "ConferenceBooking. Id: { Id}" , model . Id ) ;
}
2023-05-19 19:25:28 +04:00
private bool SendConferenceBookingMessage ( int headwaiterId , string subject , string text )
{
var headwaiter = _headwaiterLogic . ReadElement ( new ( ) { Id = headwaiterId } ) ;
if ( headwaiter = = null )
{
return false ;
}
_mailWorker . MailSendAsync ( new ( )
{
MailAddress = headwaiter . HeadwaiterEmail ,
Subject = subject ,
Text = text
} ) ;
return true ;
}
2023-04-07 00:34:27 +04:00
}
}