package com.tt.honeyDue.models import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** * Residence type lookup - matching Go API * Note: Go API returns arrays directly, no wrapper */ @Serializable data class ResidenceType( val id: Int, val name: String, @SerialName("display_name") val displayNameLocalized: String = "" ) { /** Localized label for the current locale; falls back to [name]. */ val displayName: String get() = displayNameLocalized.ifBlank { name } } /** * Task frequency lookup - matching Go API TaskFrequencyResponse */ @Serializable data class TaskFrequency( val id: Int, val name: String, @SerialName("display_name") val displayNameLocalized: String = "", val days: Int? = null, @SerialName("display_order") val displayOrder: Int = 0 ) { /** Localized label for the current locale; falls back to [name]. */ val displayName: String get() = displayNameLocalized.ifBlank { name } } /** * Task priority lookup - matching Go API TaskPriorityResponse */ @Serializable data class TaskPriority( val id: Int, val name: String, @SerialName("display_name") val displayNameLocalized: String = "", val level: Int = 0, val color: String = "", @SerialName("display_order") val displayOrder: Int = 0 ) { /** Localized label for the current locale; falls back to [name]. */ val displayName: String get() = displayNameLocalized.ifBlank { name } } /** * Task category lookup - matching Go API TaskCategoryResponse */ @Serializable data class TaskCategory( val id: Int, val name: String, @SerialName("display_name") val displayNameLocalized: String = "", val description: String = "", val icon: String = "", val color: String = "", @SerialName("display_order") val displayOrder: Int = 0 ) { /** Localized label for the current locale; falls back to [name]. */ val displayName: String get() = displayNameLocalized.ifBlank { name } } /** * Contractor specialty lookup */ @Serializable data class ContractorSpecialty( val id: Int, val name: String, @SerialName("display_name") val displayNameLocalized: String = "", val description: String? = null, val icon: String? = null, @SerialName("display_order") val displayOrder: Int = 0 ) { /** Localized label for the current locale; falls back to [name]. */ val displayName: String get() = displayNameLocalized.ifBlank { name } } /** * A selectable home-profile field option (heating type, roof type, etc.), * served localized by the backend. [value] is the stable code stored on the * residence; [displayName] is the localized label. */ @Serializable data class HomeProfileOption( val value: String, @SerialName("display_name") val displayName: String ) /** * Minimal contractor info for task references */ @Serializable data class ContractorMinimal( val id: Int, val name: String, val company: String? = null ) /** * Static data response - all lookups in one call * Note: This may need adjustment based on Go API implementation */ @Serializable data class StaticDataResponse( @SerialName("residence_types") val residenceTypes: List, @SerialName("task_frequencies") val taskFrequencies: List, @SerialName("task_priorities") val taskPriorities: List, @SerialName("task_categories") val taskCategories: List, @SerialName("contractor_specialties") val contractorSpecialties: List ) /** * Unified seeded data response - all lookups + task templates in one call * Supports ETag-based conditional fetching for efficient caching */ @Serializable data class SeededDataResponse( @SerialName("residence_types") val residenceTypes: List, @SerialName("task_categories") val taskCategories: List, @SerialName("task_priorities") val taskPriorities: List, @SerialName("task_frequencies") val taskFrequencies: List, @SerialName("contractor_specialties") val contractorSpecialties: List, @SerialName("task_templates") val taskTemplates: TaskTemplatesGroupedResponse, @SerialName("home_profile_options") val homeProfileOptions: Map> = emptyMap(), @SerialName("document_types") val documentTypes: List = emptyList(), @SerialName("document_categories") val documentCategories: List = emptyList() ) // Legacy wrapper responses for backward compatibility // These can be removed once all code is migrated to use arrays directly @Serializable data class ResidenceTypeResponse( val count: Int, val results: List ) @Serializable data class TaskFrequencyResponse( val count: Int, val results: List ) @Serializable data class TaskPriorityResponse( val count: Int, val results: List ) @Serializable data class TaskCategoryResponse( val count: Int, val results: List ) @Serializable data class ContractorSpecialtyResponse( val count: Int, val results: List )