using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System.Text.Json.Serialization;

namespace Insight.Infrastructure.Entities
{
    [BsonIgnoreExtraElements]
    public class HostUserEntity
    {
        [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")]
        public string? Id { get; set; }

        [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")]
        public string? Host { get; set; }

        [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")]
        public string? Batch { get; set; }

        [BsonElement("insert")]
        public DateTime? Insert { get; set; }

        [BsonElement("update")]
        public DateTime? Update { get; set; }

        [BsonElement("sid")]
        public string? Sid { get; set; }

        [BsonElement("name")]
        public string? Name { get; set; }

        [BsonElement("domain")]
        public string? Domain { get; set; }

        [BsonElement("fullname")]
        public string? FullName { get; set; }

        [BsonElement("description")]
        public string? Description { get; set; }

        [BsonElement("status")]
        public string? Status { get; set; }

        [BsonElement("localaccount")]
        public bool? LocalAccount { get; set; }

        [BsonElement("disabled")]
        public bool? Disabled { get; set; }

        [BsonElement("lockout")]
        public bool? Lockout { get; set; }

        [BsonElement("password_changeable")]
        public bool? PasswordChangeable { get; set; }

        [BsonElement("password_expires")]
        public bool? PasswordExpires { get; set; }

        [BsonElement("password_required")]
        public bool? PasswordRequired { get; set; }
    }

    [BsonIgnoreExtraElements]
    public class HostGroupEntity
    {
        [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")]
        public string? Id { get; set; }

        [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")]
        public string? Host { get; set; }

        [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")]
        public string? Batch { get; set; }

        [BsonElement("insert")]
        public DateTime? Insert { get; set; }

        [BsonElement("update")]
        public DateTime? Update { get; set; }

        [BsonElement("sid")]
        public string? Sid { get; set; }

        [BsonElement("name")]
        public string? Name { get; set; }

        [BsonElement("domain")]
        public string? Domain { get; set; }

        [BsonElement("description")]
        public string? Description { get; set; }

        [BsonElement("localaccount")]
        public bool? LocalAccount { get; set; }
    }

    [BsonIgnoreExtraElements]
    public class HostUserGroupEntity
    {
        [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")]
        public string? Id { get; set; }

        [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")]
        public string? Host { get; set; }

        [BsonElement("_user"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("user")]
        public string? User { get; set; }

        [BsonElement("_group"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("group")]
        public string? Group { get; set; }

        [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")]
        public string? Batch { get; set; }

        [BsonElement("insert")]
        public DateTime? Insert { get; set; }

        [BsonElement("update")]
        public DateTime? Update { get; set; }
    }
}