using System.ComponentModel.DataAnnotations; using System.Text.Json; using Tiku.Application.TenantAdmin; using Tiku.Domain.Common; namespace Tiku.Api.Contracts; public sealed class TenantAdminClassQueryDto { public Guid? RegionId { get; set; } public string? Status { get; set; } public string? Keyword { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminClassFilter ToFilter() { return new TenantAdminClassFilter(RegionId, Status, Keyword, Limit); } } public sealed class TenantAdminClassMemberQueryDto { [Required] public Guid ClassId { get; set; } public string? MemberType { get; set; } public string? Status { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminClassMemberFilter ToFilter() { return new TenantAdminClassMemberFilter(ClassId, MemberType, Status, Limit); } } public sealed class TenantAdminStudentQueryDto { public Guid? RegionId { get; set; } public Guid? ClassId { get; set; } public string? Status { get; set; } public string? Keyword { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminStudentFilter ToFilter() { return new TenantAdminStudentFilter(RegionId, ClassId, Status, Keyword, Limit); } } public sealed class TenantAdminStudentActivityQueryDto { public Guid? StudentUserId { get; set; } public string? Status { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminStudentActivityFilter ToFilter() { return new TenantAdminStudentActivityFilter(StudentUserId, Status, Limit); } } public sealed class UpsertTenantAdminClassDto { public Guid? Id { get; set; } public Guid? RegionId { get; set; } public string? LegacyId { get; set; } public string? Code { get; set; } public required string Name { get; set; } public string? Description { get; set; } public string? Status { get; set; } public int? Order { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminClassCommand ToCommand() { return new UpsertTenantAdminClassCommand(Id, RegionId, LegacyId, Code, Name, Description, Status, Order, Metadata); } } public sealed class TenantAdminUserLookupDto { public Guid? UserId { get; set; } public string? Username { get; set; } public string? Email { get; set; } public string? Phone { get; set; } public string? Name { get; set; } public string? AvatarUrl { get; set; } public UserLookupCommand ToCommand() { return new UserLookupCommand(UserId, Username, Email, Phone, Name, AvatarUrl); } } public sealed class UpsertTenantAdminClassMemberDto { [Required] public Guid ClassId { get; set; } public TenantAdminUserLookupDto User { get; set; } = new(); public string? MemberType { get; set; } public string? Status { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminClassMemberCommand ToCommand() { return new UpsertTenantAdminClassMemberCommand(ClassId, User.ToCommand(), MemberType, Status, Metadata); } } public sealed class RemoveTenantAdminClassMemberDto { [Required] public Guid ClassMemberId { get; set; } } public sealed class UpsertTenantAdminStudentDto { public TenantAdminUserLookupDto User { get; set; } = new(); public Guid? RegionId { get; set; } public Guid? SelectedSchoolId { get; set; } public Guid? SelectedMajorId { get; set; } public string? AvatarPreset { get; set; } public JsonElement Stats { get; set; } = JsonDefaults.Object(); public JsonElement Progress { get; set; } = JsonDefaults.Object(); public JsonElement ModuleSelections { get; set; } = JsonDefaults.Object(); public JsonElement RawProfile { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminStudentCommand ToCommand() { return new UpsertTenantAdminStudentCommand( User.ToCommand(), RegionId, SelectedSchoolId, SelectedMajorId, AvatarPreset, Stats, Progress, ModuleSelections, RawProfile); } } public sealed class UpdateTenantAdminStudentStatusDto { [Required] public Guid UserId { get; set; } public string? Status { get; set; } public string? Reason { get; set; } public UpdateTenantAdminStudentStatusCommand ToCommand() { return new UpdateTenantAdminStudentStatusCommand(UserId, Status, Reason); } } public sealed class UpsertTenantAdminStudentNoteDto { public Guid? Id { get; set; } [Required] public Guid StudentUserId { get; set; } public string? NoteType { get; set; } public required string Content { get; set; } public string? Visibility { get; set; } public bool? IsPinned { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminStudentNoteCommand ToCommand() { return new UpsertTenantAdminStudentNoteCommand(Id, StudentUserId, NoteType, Content, Visibility, IsPinned, Metadata); } } public sealed class UpsertTenantAdminStudentFollowupDto { public Guid? Id { get; set; } [Required] public Guid StudentUserId { get; set; } public Guid? AssignedToUserId { get; set; } public Guid? ClassId { get; set; } public required string Title { get; set; } public string? Description { get; set; } public string? FollowupType { get; set; } public string? Priority { get; set; } public string? Status { get; set; } public DateTimeOffset? DueAt { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminStudentFollowupCommand ToCommand() { return new UpsertTenantAdminStudentFollowupCommand( Id, StudentUserId, AssignedToUserId, ClassId, Title, Description, FollowupType, Priority, Status, DueAt, Metadata); } }