using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Proto; using Google.Protobuf.Collections; using NodaTime; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json; namespace DysonNetwork.Drive.Storage.Model; // File Upload Task Parameters public class FileUploadParameters { public string FileName { get; set; } = string.Empty; public long FileSize { get; set; } public string ContentType { get; set; } = string.Empty; public long ChunkSize { get; set; } = 5242880L; public int ChunksCount { get; set; } public int ChunksUploaded { get; set; } public Guid PoolId { get; set; } public Guid? BundleId { get; set; } public string? EncryptPassword { get; set; } public string Hash { get; set; } = string.Empty; public List UploadedChunks { get; set; } = []; } // File Move Task Parameters public class FileMoveParameters { public List FileIds { get; set; } = []; public Guid TargetPoolId { get; set; } public Guid? TargetBundleId { get; set; } public int FilesProcessed { get; set; } } // File Compression Task Parameters public class FileCompressParameters { public List FileIds { get; set; } = []; public string CompressionFormat { get; set; } = "zip"; public int CompressionLevel { get; set; } = 6; public string? OutputFileName { get; set; } public int FilesProcessed { get; set; } public string? ResultFileId { get; set; } } // Bulk Operation Task Parameters public class BulkOperationParameters { public string OperationType { get; set; } = string.Empty; public List TargetIds { get; set; } = []; public Dictionary OperationParameters { get; set; } = new(); public int ItemsProcessed { get; set; } public Dictionary? OperationResults { get; set; } } // Storage Migration Task Parameters public class StorageMigrationParameters { public Guid SourcePoolId { get; set; } public Guid TargetPoolId { get; set; } public List FileIds { get; set; } = new(); public bool PreserveOriginals { get; set; } = true; public long TotalBytesToTransfer { get; set; } public long BytesTransferred { get; set; } public int FilesMigrated { get; set; } } // Helper class for parameter operations using GrpcTypeHelper public static class ParameterHelper { public static T? Typed(Dictionary parameters) { var rawParams = GrpcTypeHelper.ConvertObjectToByteString(parameters); return GrpcTypeHelper.ConvertByteStringToObject(rawParams); } public static Dictionary Untyped(T parameters) { var rawParams = GrpcTypeHelper.ConvertObjectToByteString(parameters); return GrpcTypeHelper.ConvertByteStringToObject>(rawParams) ?? []; } } public class CreateUploadTaskRequest { public string Hash { get; set; } = null!; public string FileName { get; set; } = null!; public long FileSize { get; set; } public string ContentType { get; set; } = null!; public Guid? PoolId { get; set; } = null!; public Guid? BundleId { get; set; } public string? EncryptPassword { get; set; } public Instant? ExpiredAt { get; set; } public long? ChunkSize { get; set; } } public class CreateUploadTaskResponse { public bool FileExists { get; set; } public SnCloudFile? File { get; set; } public string? TaskId { get; set; } public long? ChunkSize { get; set; } public int? ChunksCount { get; set; } } internal class UploadTask { public string TaskId { get; set; } = null!; public string FileName { get; set; } = null!; public long FileSize { get; set; } public string ContentType { get; set; } = null!; public long ChunkSize { get; set; } public int ChunksCount { get; set; } public Guid PoolId { get; set; } public Guid? BundleId { get; set; } public string? EncryptPassword { get; set; } public Instant? ExpiredAt { get; set; } public string Hash { get; set; } = null!; } public class PersistentTask : ModelBase { public Guid Id { get; set; } = Guid.NewGuid(); [MaxLength(64)] public string TaskId { get; set; } = null!; [MaxLength(256)] public string Name { get; set; } = null!; [MaxLength(1024)] public string? Description { get; set; } public TaskType Type { get; set; } public TaskStatus Status { get; set; } = TaskStatus.InProgress; public Guid AccountId { get; set; } // Progress tracking (0-100) public double Progress { get; set; } // Task-specific parameters stored as JSON [Column(TypeName = "jsonb")] public Dictionary Parameters { get; set; } = new(); // Task results/output stored as JSON [Column(TypeName = "jsonb")] public Dictionary Results { get; set; } = new(); [MaxLength(1024)] public string? ErrorMessage { get; set; } public Instant? StartedAt { get; set; } public Instant? CompletedAt { get; set; } public Instant? ExpiredAt { get; set; } public Instant LastActivity { get; set; } // Priority (higher = more important) public int Priority { get; set; } = 0; // Estimated duration in seconds public long? EstimatedDurationSeconds { get; set; } } // Backward compatibility - UploadTask inherits from PersistentTask public class PersistentUploadTask : PersistentTask { public PersistentUploadTask() { Type = TaskType.FileUpload; Name = "File Upload"; } // Convenience properties using typed parameters [NotMapped] public FileUploadParameters TypedParameters { get => ParameterHelper.Typed(Parameters)!; set => Parameters = ParameterHelper.Untyped(value); } [MaxLength(256)] public string FileName { get => TypedParameters.FileName; set { var parameters = TypedParameters; parameters.FileName = value; TypedParameters = parameters; } } public long FileSize { get => TypedParameters.FileSize; set { var parameters = TypedParameters; parameters.FileSize = value; TypedParameters = parameters; } } [MaxLength(128)] public string ContentType { get => TypedParameters.ContentType; set { var parameters = TypedParameters; parameters.ContentType = value; TypedParameters = parameters; } } public long ChunkSize { get => TypedParameters.ChunkSize; set { var parameters = TypedParameters; parameters.ChunkSize = value; TypedParameters = parameters; } } public int ChunksCount { get => TypedParameters.ChunksCount; set { var parameters = TypedParameters; parameters.ChunksCount = value; TypedParameters = parameters; } } public int ChunksUploaded { get => TypedParameters.ChunksUploaded; set { var parameters = TypedParameters; parameters.ChunksUploaded = value; TypedParameters = parameters; Progress = ChunksCount > 0 ? (double)value / ChunksCount * 100 : 0; } } public Guid PoolId { get => TypedParameters.PoolId; set { var parameters = TypedParameters; parameters.PoolId = value; TypedParameters = parameters; } } public Guid? BundleId { get => TypedParameters.BundleId; set { var parameters = TypedParameters; parameters.BundleId = value; TypedParameters = parameters; } } [MaxLength(256)] public string? EncryptPassword { get => TypedParameters.EncryptPassword; set { var parameters = TypedParameters; parameters.EncryptPassword = value; TypedParameters = parameters; } } public string Hash { get => TypedParameters.Hash; set { var parameters = TypedParameters; parameters.Hash = value; TypedParameters = parameters; } } // JSON array of uploaded chunk indices for resumability public List UploadedChunks { get => TypedParameters.UploadedChunks; set { var parameters = TypedParameters; parameters.UploadedChunks = value; TypedParameters = parameters; } } } public enum TaskType { FileUpload, FileMove, FileCompress, FileDecompress, FileEncrypt, FileDecrypt, BulkOperation, StorageMigration, FileConversion, Custom } [Flags] public enum TaskStatus { Pending, InProgress, Paused, Completed, Failed, Cancelled, Expired } // File Move Task public class FileMoveTask : PersistentTask { public FileMoveTask() { Type = TaskType.FileMove; Name = "Move Files"; } // Convenience properties using typed parameters public FileMoveParameters TypedParameters { get => ParameterHelper.Typed(Parameters)!; set => Parameters = ParameterHelper.Untyped(value); } public List FileIds { get => TypedParameters.FileIds; set { var parameters = TypedParameters; parameters.FileIds = value; TypedParameters = parameters; } } public Guid TargetPoolId { get => TypedParameters.TargetPoolId; set { var parameters = TypedParameters; parameters.TargetPoolId = value; TypedParameters = parameters; } } public Guid? TargetBundleId { get => TypedParameters.TargetBundleId; set { var parameters = TypedParameters; parameters.TargetBundleId = value; TypedParameters = parameters; } } public int FilesProcessed { get => TypedParameters.FilesProcessed; set { var parameters = TypedParameters; parameters.FilesProcessed = value; TypedParameters = parameters; Progress = FileIds.Count > 0 ? (double)value / FileIds.Count * 100 : 0; } } } // File Compression Task public class FileCompressTask : PersistentTask { public FileCompressTask() { Type = TaskType.FileCompress; Name = "Compress Files"; } // Convenience properties using typed parameters public FileCompressParameters TypedParameters { get => ParameterHelper.Typed(Parameters)!; set => Parameters = ParameterHelper.Untyped(value); } public List FileIds { get => TypedParameters.FileIds; set { var parameters = TypedParameters; parameters.FileIds = value; TypedParameters = parameters; } } [MaxLength(32)] public string CompressionFormat { get => TypedParameters.CompressionFormat; set { var parameters = TypedParameters; parameters.CompressionFormat = value; TypedParameters = parameters; } } public int CompressionLevel { get => TypedParameters.CompressionLevel; set { var parameters = TypedParameters; parameters.CompressionLevel = value; TypedParameters = parameters; } } public string? OutputFileName { get => TypedParameters.OutputFileName; set { var parameters = TypedParameters; parameters.OutputFileName = value; TypedParameters = parameters; } } public int FilesProcessed { get => TypedParameters.FilesProcessed; set { var parameters = TypedParameters; parameters.FilesProcessed = value; TypedParameters = parameters; Progress = FileIds.Count > 0 ? (double)value / FileIds.Count * 100 : 0; } } public string? ResultFileId { get => TypedParameters.ResultFileId; set { var parameters = TypedParameters; parameters.ResultFileId = value; TypedParameters = parameters; } } } // Bulk Operation Task public class BulkOperationTask : PersistentTask { public BulkOperationTask() { Type = TaskType.BulkOperation; Name = "Bulk Operation"; } // Convenience properties using typed parameters public BulkOperationParameters TypedParameters { get => ParameterHelper.Typed(Parameters)!; set => Parameters = ParameterHelper.Untyped(value); } [MaxLength(128)] public string OperationType { get => TypedParameters.OperationType; set { var parameters = TypedParameters; parameters.OperationType = value; TypedParameters = parameters; } } public List TargetIds { get => TypedParameters.TargetIds; set { var parameters = TypedParameters; parameters.TargetIds = value; TypedParameters = parameters; } } [Column(TypeName = "jsonb")] public Dictionary OperationParameters { get => TypedParameters.OperationParameters; set { var parameters = TypedParameters; parameters.OperationParameters = value; TypedParameters = parameters; } } public int ItemsProcessed { get => TypedParameters.ItemsProcessed; set { var parameters = TypedParameters; parameters.ItemsProcessed = value; TypedParameters = parameters; Progress = TargetIds.Count > 0 ? (double)value / TargetIds.Count * 100 : 0; } } [Column(TypeName = "jsonb")] public Dictionary? OperationResults { get => TypedParameters.OperationResults; set { var parameters = TypedParameters; parameters.OperationResults = value; TypedParameters = parameters; } } } // Storage Migration Task public class StorageMigrationTask : PersistentTask { public StorageMigrationTask() { Type = TaskType.StorageMigration; Name = "Storage Migration"; } // Convenience properties using typed parameters public StorageMigrationParameters TypedParameters { get => ParameterHelper.Typed(Parameters)!; set => Parameters = ParameterHelper.Untyped(value); } public Guid SourcePoolId { get => TypedParameters.SourcePoolId; set { var parameters = TypedParameters; parameters.SourcePoolId = value; TypedParameters = parameters; } } public Guid TargetPoolId { get => TypedParameters.TargetPoolId; set { var parameters = TypedParameters; parameters.TargetPoolId = value; TypedParameters = parameters; } } public List FileIds { get => TypedParameters.FileIds; set { var parameters = TypedParameters; parameters.FileIds = value; TypedParameters = parameters; } } public bool PreserveOriginals { get => TypedParameters.PreserveOriginals; set { var parameters = TypedParameters; parameters.PreserveOriginals = value; TypedParameters = parameters; } } public long TotalBytesToTransfer { get => TypedParameters.TotalBytesToTransfer; set { var parameters = TypedParameters; parameters.TotalBytesToTransfer = value; TypedParameters = parameters; } } public long BytesTransferred { get => TypedParameters.BytesTransferred; set { var parameters = TypedParameters; parameters.BytesTransferred = value; TypedParameters = parameters; Progress = TotalBytesToTransfer > 0 ? (double)value / TotalBytesToTransfer * 100 : 0; } } public int FilesMigrated { get => TypedParameters.FilesMigrated; set { var parameters = TypedParameters; parameters.FilesMigrated = value; TypedParameters = parameters; } } } // Legacy enum for backward compatibility public enum UploadTaskStatus { InProgress = TaskStatus.InProgress, Completed = TaskStatus.Completed, Failed = TaskStatus.Failed, Expired = TaskStatus.Expired }