using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.ComponentModel.DataAnnotations;
using PersonalFinance.Utils;
using System.ComponentModel.DataAnnotations.Schema;
using System.Globalization;
namespace PersonalFinance
{
///
/// Genger
///
public enum Sex { Male, Female }
///
/// User class for storing payments of each member of the family
/// Each user has its own financial management
///
public class User
{
public User() {}
public User(string password)
{
SetPassword(password);
}
///
/// Unique user identification number (Primary key)
///
[Key]
public int UserId { get; set; }
///
/// Unique name for sign in
///
private string login;
[Required]
public string Login {
get { return login; }
set
{
if (value == null) { throw new ArgumentNullException("Login cannot be null."); }
else if (value.Length < 3) { throw new ArgumentOutOfRangeException("Login must be at least 3 character length!"); }
else { login = RemoveDiacritics(value); }
}
}
private string RemoveDiacritics(string text)
{
var normalizedString = text.Normalize(NormalizationForm.FormD);
var stringBuilder = new StringBuilder();
foreach (var c in normalizedString)
{
var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
if (unicodeCategory != UnicodeCategory.NonSpacingMark)
{
stringBuilder.Append(c);
}
}
return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}
///
/// Password for sign in
///
[Required]
private string password;
public string Password { get { return password; } }
private string name;
///
/// User real name
///
public string Name
{
get { return name; }
set
{
if (value == null) { throw new ArgumentNullException("Name cannot be null."); }
else { name = value; }
}
}
///
/// User real lastname
///
private string lastname;
public string Lastname
{
get { return lastname; }
set
{
if (value == null) { throw new ArgumentNullException("Lastname cannot be null."); }
else { lastname = value; }
}
}
///
/// Sex (gender) of user
///
public Sex Sex { get; set; }
public void SetPassword(string passwordToHash)
{
if (passwordToHash == null) throw new ArgumentNullException();
else if (passwordToHash.Length < 6) throw new ArgumentOutOfRangeException("Password must be at least 6 character length!");
this.password = PasswordHash.CreateHash(passwordToHash);
}
public bool ComparePassword(string passwordToCompare)
{
return PasswordHash.ValidatePassword(passwordToCompare, Password);
}
public override string ToString()
{
return string.Format("User {0}: {1} ({2} {3})", UserId, Login, Name, Lastname);
}
}
}