package com.example.mycrib.models import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class CustomTask ( val id: Int, val residence: Int, @SerialName("created_by") val createdBy: Int, @SerialName("created_by_username") val createdByUsername: String, val title: String, val description: String? = null, val category: TaskCategory?, val frequency: TaskFrequency, val priority: TaskPriority, val status: TaskStatus? = null, @SerialName("due_date") val dueDate: String?, @SerialName("next_scheduled_date") val nextScheduledDate: String? = null, @SerialName("estimated_cost") val estimatedCost: Double? = null, @SerialName("actual_cost") val actualCost: Double? = null, @SerialName("completion_count") val completionCount: Int? = null, val notes: String? = null, val archived: Boolean = false, @SerialName("created_at") val createdAt: String, @SerialName("updated_at") val updatedAt: String, @SerialName("show_completed_button") val showCompletedButton: Boolean = false, @SerialName("days_until_due") val daysUntilDue: Int? = null, @SerialName("is_overdue") val isOverdue: Boolean? = null, @SerialName("last_completion") val lastCompletion: LastCompletion? = null ) @Serializable data class LastCompletion( @SerialName("completion_date") val completionDate: String, @SerialName("completed_by") val completedBy: String?, @SerialName("actual_cost") val actualCost: Double?, val rating: Int? ) @Serializable data class TaskCreateRequest( val residence: Int, val title: String, val description: String? = null, val category: Int, val frequency: Int, @SerialName("interval_days") val intervalDays: Int? = null, val priority: Int, val status: Int? = null, @SerialName("due_date") val dueDate: String, @SerialName("estimated_cost") val estimatedCost: Double? = null, val archived: Boolean = false ) @Serializable data class TaskDetail( val id: Int, val residence: Int, @SerialName("residence_name") val residenceName: String? = null, @SerialName("created_by") val createdBy: Int? = null, @SerialName("created_by_username") val createdByUsername: String? = null, val title: String, val description: String?, val category: TaskCategory, val priority: TaskPriority, val frequency: TaskFrequency, val status: TaskStatus?, @SerialName("due_date") val dueDate: String?, @SerialName("interval_days") val intervalDays: Int? = null, @SerialName("estimated_cost") val estimatedCost: Double? = null, val archived: Boolean = false, @SerialName("created_at") val createdAt: String, @SerialName("updated_at") val updatedAt: String, @SerialName("next_scheduled_date") val nextScheduledDate: String? = null, @SerialName("show_completed_button") val showCompletedButton: Boolean = false, val completions: List ) @Serializable data class TasksByResidenceResponse( @SerialName("residence_id") val residenceId: String, @SerialName("days_threshold") val daysThreshold: Int, val summary: CategorizedTaskSummary, @SerialName("upcoming_tasks") val upcomingTasks: List, @SerialName("in_progress_tasks") val inProgressTasks: List, @SerialName("done_tasks") val doneTasks: List, @SerialName("archived_tasks") val archivedTasks: List ) @Serializable data class CategorizedTaskSummary( val upcoming: Int, @SerialName("in_progress") val inProgress: Int, val done: Int, val archived: Int ) @Serializable data class AllTasksResponse( @SerialName("days_threshold") val daysThreshold: Int, val summary: CategorizedTaskSummary, @SerialName("upcoming_tasks") val upcomingTasks: List, @SerialName("in_progress_tasks") val inProgressTasks: List, @SerialName("done_tasks") val doneTasks: List, @SerialName("archived_tasks") val archivedTasks: List ) @Serializable data class TaskCancelResponse( val message: String, val task: TaskDetail ) /** * Request model for PATCH updates to a task. * Used for status changes and archive/unarchive operations. * All fields are optional - only provided fields will be updated. */ @Serializable data class TaskPatchRequest( val status: Int? = null, // Status ID to update val archived: Boolean? = null // Archive/unarchive flag ) /** * Minimal task model for list/kanban views. * Uses IDs instead of nested objects for efficiency. * Resolve IDs to full objects via DataCache.getTaskCategory(), etc. */ @Serializable data class TaskMinimal( val id: Int, val title: String, val description: String? = null, @SerialName("due_date") val dueDate: String? = null, @SerialName("next_scheduled_date") val nextScheduledDate: String? = null, @SerialName("category_id") val categoryId: Int? = null, @SerialName("frequency_id") val frequencyId: Int, @SerialName("priority_id") val priorityId: Int, @SerialName("status_id") val statusId: Int? = null, @SerialName("completion_count") val completionCount: Int? = null, val archived: Boolean = false ) @Serializable data class TaskColumn( val name: String, @SerialName("display_name") val displayName: String, @SerialName("button_types") val buttonTypes: List, val icons: Map, val color: String, val tasks: List, // Keep using TaskDetail for now - will be TaskMinimal after full migration val count: Int ) @Serializable data class TaskColumnsResponse( val columns: List, @SerialName("days_threshold") val daysThreshold: Int? = null, @SerialName("residence_id") val residenceId: String? = null )