using DebtMgr.Model;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using SQLiteNetExtensions.Extensions;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Windows;
namespace DebtMgr.ViewModel.Dialogs
{
public class AddTransactionViewModel : ViewModelBase
{
#region Public Properties
public event EventHandler RequestClose;
public TransactionType DialogMode { get; set; }
public Person PreselectedPerson { get; set; }
#endregion
#region WindowTitle (string) Property
///
/// Privater Teil von
///
private string _windowTitle;
///
/// Comment
///
public string WindowTitle
{
get { return _windowTitle; }
set
{
_windowTitle = value;
RaisePropertyChanged(() => WindowTitle);
}
}
#endregion
#region WindowIcon (string) Property
///
/// Privater Teil von
///
private string _windowIcon;
///
/// Comment
///
public string WindowIcon
{
get { return _windowIcon; }
set
{
_windowIcon = value;
RaisePropertyChanged(() => WindowIcon);
}
}
#endregion
#region AmountTextBoxText (string) Property
///
/// Privater Teil von
///
private string _amountTextBoxText;
///
/// Comment
///
public string AmountTextBoxText
{
get
{
return _amountTextBoxText;
}
set
{
_amountTextBoxText = value;
RaisePropertyChanged(() => AmountTextBoxText);
AddTransactionButtonClickCommand.RaiseCanExecuteChanged();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Gets the amount text box text as number representation.
///
/// The amount text box text number representation.
////////////////////////////////////////////////////////////////////////////////////////////////////
public double AmountTextBoxTextNumberRepresentation
{
get
{
if (string.IsNullOrWhiteSpace(_amountTextBoxText)) return 0.0;
return double.Parse(_amountTextBoxText, CultureInfo.InvariantCulture);
}
}
#endregion
#region DescriptionTextBoxText (string) Property
///
/// Privater Teil von
///
private string _descriptionTextBoxText;
///
/// DescriptionTextBoxText
///
public string DescriptionTextBoxText
{
get { return _descriptionTextBoxText; }
set
{
_descriptionTextBoxText = value;
RaisePropertyChanged(() => DescriptionTextBoxText);
AddTransactionButtonClickCommand.RaiseCanExecuteChanged();
}
}
#endregion
#region DatePickerSelectedDate (DateTime?) Property
///
/// Privater Teil von
///
private DateTime? _datePickerSelectedDate;
///
/// Comment
///
public DateTime? DatePickerSelectedDate
{
get { return _datePickerSelectedDate; }
set
{
_datePickerSelectedDate = value;
RaisePropertyChanged(() => DatePickerSelectedDate);
AddTransactionButtonClickCommand.RaiseCanExecuteChanged();
}
}
#endregion
#region PersonComboBoxItemSource (List) Property
///
/// Privater Teil von
///
private List _personComboBoxItemSource;
///
/// Comment
///
public List PersonComboBoxItemSource
{
get { return _personComboBoxItemSource; }
set
{
_personComboBoxItemSource = value;
RaisePropertyChanged(() => PersonComboBoxItemSource);
}
}
#endregion
#region PersonComboBoxSelectedItem (Person) Property
///
/// Privater Teil von
///
private Person _personComboBoxSelectedItem;
///
/// Comment
///
public Person PersonComboBoxSelectedItem
{
get { return _personComboBoxSelectedItem; }
set
{
_personComboBoxSelectedItem = value;
RaisePropertyChanged(() => PersonComboBoxSelectedItem);
AddTransactionButtonClickCommand.RaiseCanExecuteChanged();
}
}
#endregion
#region AddTransactionButtonClickCommand Command
///
/// Private member backing variable for
///
private RelayCommand _addTransactionButtonClickCommand = null;
///
/// Comment
///
public RelayCommand AddTransactionButtonClickCommand => _addTransactionButtonClickCommand ?? (_addTransactionButtonClickCommand = new RelayCommand(AddTransactionButtonClickCommand_Execute, AddTransactionButtonClickCommand_CanExecute));
private bool AddTransactionButtonClickCommand_CanExecute()
{
if (AmountTextBoxTextNumberRepresentation < 0.01) return false;
if (string.IsNullOrWhiteSpace(DescriptionTextBoxText)) return false;
if (PersonComboBoxSelectedItem == null) return false;
if (DatePickerSelectedDate == null) return false;
return true;
}
private void AddTransactionButtonClickCommand_Execute()
{
if (AddTransactionButtonClickCommand_CanExecute())
{
try
{
var person = App.Database.Get(PersonComboBoxSelectedItem.Id);
App.Database.GetChildren(person);
if (DatePickerSelectedDate != null)
person.Transactions.Add(new Transaction
{
Amount = AmountTextBoxTextNumberRepresentation,
Type = DialogMode,
Description = DescriptionTextBoxText,
PersonId = person.Id,
Time = DatePickerSelectedDate.Value.AddHours(12)
});
App.Database.InsertOrReplaceWithChildren(person);
RequestClose?.Invoke(null, null);
App.Locator.MainView.UpdatePersonsList();
}
catch (Exception)
{
MessageBox.Show("Something bad happened", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Default constructor.
///
/// Andre Beging, 10.09.2017.
////////////////////////////////////////////////////////////////////////////////////////////////////
public AddTransactionViewModel()
{
UpdatesPersonsComboBox();
}
#region UpdatesPersonsComboBox()
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Updates persons combo box.
///
/// Andre Beging, 09.09.2017.
////////////////////////////////////////////////////////////////////////////////////////////////////
public void UpdatesPersonsComboBox()
{
var personList = App.Database.Table().OrderBy(x => x.FirstName).ToList();
PersonComboBoxItemSource = personList;
}
#endregion
#region SetModeSpecificStrings()
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Sets mode specific strings.
///
/// Andre Beging, 09.09.2017.
////////////////////////////////////////////////////////////////////////////////////////////////////
public void SetModeSpecificStrings()
{
if (DialogMode == TransactionType.Deposit)
{
WindowTitle = "Add Deposit";
WindowIcon = "../../Content/money_green.ico";
}
if (DialogMode == TransactionType.Charge)
{
WindowTitle = "Add Charge";
WindowIcon = "../../Content/money_red.ico";
}
PersonComboBoxSelectedItem =
PersonComboBoxItemSource.FirstOrDefault(x => x.Id == PreselectedPerson?.Id);
}
#endregion
#region ClearView()
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Clears the view.
///
/// Andre Beging, 09.09.2017.
////////////////////////////////////////////////////////////////////////////////////////////////////
public void ClearView()
{
AmountTextBoxText = string.Empty;
DescriptionTextBoxText = string.Empty;
PersonComboBoxSelectedItem = null;
DatePickerSelectedDate = DateTime.Now;
}
#endregion
}
}