using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using gehGassiApp.Domain.Base;
using gehGassiApp.Domain.Common;
namespace gehGassiApp.Domain.Users
{
///
/// Repräsentiert einen App-User.
/// Ist verbunden mit USER
///
public class AppUser : SyncEntity
{
private string _photo;
private AppUserType _type;
private string _title;
private string _firstName;
private string _lastName;
private Sex _sex;
private DateTimeOffset? _birthDate;
private ContactMin _contact;
private Address _address;
private SocialMedia _socialMedia;
private RatingStatistics _ratingStatistics;
private RatingStatistics _ratingStatisticsWalker;
private bool _autoPayout;
///
/// Art des App-Users
///
[Required]
[JsonPropertyName("type")]
public AppUserType Type
{
get => _type;
set
{
_type = value;
OnPropertyChanged(nameof(Type));
}
}
///
/// Anrede / titel
///
[MaxLength(50)]
[JsonPropertyName("title")]
public string Title
{
get => _title;
set
{
_title = value;
OnPropertyChanged(nameof(Title));
}
}
///
/// Vorname
///
[Required]
[MaxLength(150)]
[JsonPropertyName("firstName")]
public string FirstName
{
get => _firstName;
set
{
_firstName = value;
OnPropertyChanged(nameof(FirstName));
OnPropertyChanged(nameof(Initials));
}
}
///
/// Nachname
///
[Required]
[MaxLength(150)]
[JsonPropertyName("lastName")]
public string LastName
{
get => _lastName;
set
{
_lastName = value;
OnPropertyChanged(nameof(LastName));
OnPropertyChanged(nameof(Initials));
}
}
///
/// Geschlecht
///
[Required]
[JsonPropertyName("sex")]
public Sex Sex
{
get => _sex;
set
{
_sex = value;
OnPropertyChanged(nameof(Sex));
}
}
///
/// Optional - Geburtstag
///
[JsonPropertyName("birthDate")]
public DateTimeOffset? BirthDate
{
get => _birthDate;
set
{
_birthDate = value;
OnPropertyChanged(nameof(BirthDate));
}
}
///
/// Optional - Foto des Benutzers
///
[MaxLength(500)]
[JsonPropertyName("photo")]
public string Photo
{
get
{
if(string.IsNullOrWhiteSpace(_photo))
return string.Empty;
if (!_photo.ToLower().StartsWith("http"))
{
if(!File.Exists(_photo))
return Path.Combine(FileSystem.AppDataDirectory, Path.GetFileName(_photo) ?? string.Empty);
}
return _photo;
}
set
{
_photo = value;
OnPropertyChanged(nameof(Photo));
OnPropertyChanged(nameof(ProfileNotFinished));
}
}
///
/// Kontaktdaten
///
[JsonPropertyName("contact")]
public ContactMin Contact
{
get => _contact;
set
{
_contact = value;
OnPropertyChanged(nameof(Contact));
}
}
///
/// Adressdaten
///
[JsonPropertyName("address")]
public Address Address
{
get => _address;
set
{
_address = value;
OnPropertyChanged(nameof(Address));
OnPropertyChanged(nameof(ProfileNotFinished));
}
}
///
/// Breitengrad der Adresse
///
[JsonPropertyName("lat")]
public double Lat { get; set; }
///
/// Längengrad der Adresse
///
[JsonPropertyName("lng")]
public double Lng { get; set; }
///
/// Socialmedia Daten
///
[JsonPropertyName("socialMedia")]
public SocialMedia SocialMedia
{
get => _socialMedia;
set
{
_socialMedia = value;
OnPropertyChanged(nameof(SocialMedia));
}
}
///
/// Rating-Statistiken für den Hundebesitzer
///
[JsonPropertyName("ratingStatistics")]
public RatingStatistics RatingStatistics
{
get => _ratingStatistics;
set
{
_ratingStatistics = value;
OnPropertyChanged();
}
}
///
/// Ratingstatistiken wenn auch oder nur Walker
///
[JsonPropertyName("ratingStatisticsWalker")]
public RatingStatistics RatingStatisticsWalker
{
get => _ratingStatisticsWalker;
set
{
_ratingStatisticsWalker = value;
OnPropertyChanged();
}
}
///
/// Gesperrt
///
[Required]
[JsonPropertyName("locked")]
public bool Locked { get; set; }
///
/// Gesperrt bis
///
[JsonPropertyName("lockedUntil")]
public DateTimeOffset? LockedUntil { get; set; }
///
/// Wurden die AGB akzeptiert
///
[Required]
[JsonPropertyName("termsAccepted")]
public bool TermsAccepted { get; set; }
///
/// Wann wurden die AGB akzeptiert?
///
[JsonPropertyName("termsAcceptedDate")]
public DateTimeOffset? TermsAcceptedDate { get; set; }
///
/// Wurden die Datenschutzbedingungen akzeptiert
///
[Required]
[JsonPropertyName("privacyAccepted")]
public bool PrivacyAccepted { get; set; }
///
/// Wann wurden die Datenschutzbedingungen akzeptiert?
///
[JsonPropertyName("privacyAcceptedDate")]
public DateTimeOffset? PrivacyAcceptedDate { get; set; }
///
/// Wurden die Datenschutzbedingungen des Paymentproviders akzeptiert
///
[Required]
[JsonPropertyName("paymentTermsAccepted")]
public bool PaymentTermsAccepted { get; set; }
///
/// Wann wurden die Datenschutzbedingungen des Paymentproviders akzeptiert?
///
[JsonPropertyName("paymentTermsAcceptedDate")]
public DateTimeOffset? PaymentTermsAcceptedDate { get; set; }
///
/// Nationalität ISO-2
///
[MaxLength(2)]
[JsonPropertyName("nationalityCode")]
public string NationalityCode { get; set; }
///
/// Land Hauptwohnsitz ISO-2
///
[MaxLength(2)]
[JsonPropertyName("mainResidenceCode")]
public string MainResidenceCode { get; set; }
///
/// ID des AppUsers beim Payment-Provider
///
[MaxLength(255)]
[JsonPropertyName("paymentId")]
public string PaymentId { get; set; }
///
/// Gibt an ob der Benutzer den KYC-Prozess durchlaufen hat
///
[Required]
[JsonPropertyName("kycPassed")]
public bool KycPassed { get; set; }
///
/// Wann wurde der KYC-Prozess erfolgreich durchlaufen?
///
[JsonPropertyName("kycPassedDate")]
public DateTimeOffset? KycPassedDate { get; set; }
///
/// ID der aktuellen Bankverbindung bei MangoPay
///
[MaxLength(255)]
[JsonPropertyName("bankId")]
public string BankId { get; set; }
///
/// Gibt an ob es sich um einen verifizierten Benutzer handelt
///
[Required]
[JsonPropertyName("verified")]
public bool Verified { get; set; }
///
/// Wann wurde die Verification erfolgreich durchlaufen?
///
[JsonPropertyName("verifiedDate")]
public DateTimeOffset? VerifiedDate { get; set; }
///
/// Gibt an ob für den Benutzer eine automatische Auszahlung erfolgen soll
/// Das kann z.B. Wöchentlich sein.
///
[Required]
[JsonPropertyName("autoPayout")]
public bool AutoPayout
{
get => _autoPayout;
set
{
_autoPayout = value;
OnPropertyChanged();
}
}
///
/// Datum der Erstellung
///
[JsonPropertyName("created")]
public DateTimeOffset Created { get; set; }
///
/// Gibt die Initialien zurück
///
public string Initials
{
get
{
if (!string.IsNullOrWhiteSpace(FirstName) && !string.IsNullOrWhiteSpace(LastName))
return $"{FirstName.Substring(0, 1)}{LastName.Substring(0, 1)}";
else if (!string.IsNullOrWhiteSpace(FirstName) && FirstName.Length >= 2 && string.IsNullOrWhiteSpace(LastName))
return $"{FirstName.Substring(0, 2)}";
else if (string.IsNullOrWhiteSpace(FirstName) && string.IsNullOrWhiteSpace(LastName) && LastName.Length >= 2)
return $"{LastName.Substring(0, 2)}";
else
return "??";
}
}
///
/// Voller Name
///
public string FullName => $"{FirstName} {LastName}";
///
/// Gibt an ob der Benutzer das Profile noch nicht abgeschlossen hat
///
public bool ProfileNotFinished {
get
{
//Prüfen ob im Profil noch Daten fehlen
var notFinished = false;
if(string.IsNullOrWhiteSpace(Photo))
notFinished = true;
else if(string.IsNullOrWhiteSpace(Address.AddressLine1))
notFinished = true;
else if (string.IsNullOrWhiteSpace(Address.Zip))
notFinished = true;
else if (string.IsNullOrWhiteSpace(Address.City))
notFinished = true;
//TODO: hier noch Verbindung zu Walker-Profil
return notFinished;
}
}
}
}