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; } } } }