using System.Text.Json; using Tiku.Domain.Common; using Tiku.Domain.Tenancy; namespace Tiku.Application.TenantAdmin; public sealed record TenantAdminActor(Guid TenantId, Guid UserId); public sealed record TenantAdminClassFilter( Guid? RegionId = null, string? Status = null, string? Keyword = null, int? Limit = null); public sealed record TenantAdminClassMemberFilter( Guid ClassId, string? MemberType = null, string? Status = null, int? Limit = null); public sealed record TenantAdminStudentFilter( Guid? RegionId = null, Guid? ClassId = null, string? Status = null, string? Keyword = null, int? Limit = null); public sealed record TenantAdminStudentActivityFilter( Guid? StudentUserId = null, string? Status = null, int? Limit = null); public sealed record UpsertTenantAdminClassCommand( Guid? Id, Guid? RegionId, string? LegacyId, string? Code, string Name, string? Description, string? Status, int? Order, JsonElement Metadata); public sealed record UserLookupCommand( Guid? UserId, string? Username, string? Email, string? Phone, string? Name, string? AvatarUrl); public sealed record UpsertTenantAdminClassMemberCommand( Guid ClassId, UserLookupCommand User, string? MemberType, string? Status, JsonElement Metadata); public sealed record UpsertTenantAdminStudentCommand( UserLookupCommand User, Guid? RegionId, Guid? SelectedSchoolId, Guid? SelectedMajorId, string? AvatarPreset, JsonElement Stats, JsonElement Progress, JsonElement ModuleSelections, JsonElement RawProfile); public sealed record UpdateTenantAdminStudentStatusCommand( Guid UserId, string? Status, string? Reason); public sealed record UpsertTenantAdminStudentNoteCommand( Guid? Id, Guid StudentUserId, string? NoteType, string Content, string? Visibility, bool? IsPinned, JsonElement Metadata); public sealed record UpsertTenantAdminStudentFollowupCommand( Guid? Id, Guid StudentUserId, Guid? AssignedToUserId, Guid? ClassId, string Title, string? Description, string? FollowupType, string? Priority, string? Status, DateTimeOffset? DueAt, JsonElement Metadata); public sealed record TenantAdminClassList( IReadOnlyCollection Items, bool Scoped); public sealed record TenantAdminStudentList( IReadOnlyCollection Items, bool Scoped); public sealed record TenantAdminClassItem( Guid Id, Guid? RegionId, string? RegionName, string? LegacyId, string? Code, string Name, string? Description, TenantRecordStatus Status, int Order, JsonElement Metadata, int StudentCount, int StaffCount, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantAdminClassMemberItem( Guid Id, Guid ClassId, Guid UserId, TenantClassMemberType MemberType, TenantClassMemberStatus Status, DateTimeOffset JoinedAt, DateTimeOffset? LeftAt, JsonElement Metadata, TenantAdminUserSummary User); public sealed record TenantAdminUserSummary( Guid Id, string? Username, string? Email, string? Phone, string? Name, string? AvatarUrl, string PrimaryRole); public sealed record TenantAdminStudentItem( Guid MembershipId, Guid UserId, MembershipStatus Status, TenantAdminUserSummary User, Guid? ProfileId, string AvatarPreset, Guid? RegionId, string? RegionName, Guid? SelectedSchoolId, string? SelectedSchoolName, Guid? SelectedMajorId, string? SelectedMajorName, JsonElement Stats, JsonElement Progress, JsonElement ModuleSelections, IReadOnlyCollection Classes, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantAdminStudentClassSummary( Guid ClassId, string ClassName, string? ClassCode, TenantClassMemberType MemberType, DateTimeOffset JoinedAt); public sealed record TenantAdminStudentStatusItem( Guid MembershipId, Guid UserId, TenantRole Role, MembershipStatus Status, DateTimeOffset UpdatedAt); public sealed record TenantAdminStudentNoteItem( Guid Id, Guid StudentUserId, StudentNoteType NoteType, string Content, StudentNoteVisibility Visibility, bool IsPinned, JsonElement Metadata, Guid? CreatedBy, Guid? UpdatedBy, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantAdminStudentFollowupItem( Guid Id, Guid StudentUserId, Guid? AssignedToUserId, Guid? ClassId, string Title, string? Description, StudentFollowupType FollowupType, StudentFollowupPriority Priority, StudentFollowupStatus Status, DateTimeOffset? DueAt, DateTimeOffset? CompletedAt, Guid? CompletedBy, JsonElement Metadata, Guid? CreatedBy, Guid? UpdatedBy, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed class TenantAdminDirectException(string message, string code) : Exception(message) { public string Code { get; } = code; }