package housing import ( "context" "time" ) // HousingDatabase defines the interface for database operations type HousingDatabase interface { // House zone operations LoadHouseZones(ctx context.Context) ([]HouseZoneData, error) LoadHouseZone(ctx context.Context, houseID int32) (*HouseZoneData, error) SaveHouseZone(ctx context.Context, zone *HouseZone) error DeleteHouseZone(ctx context.Context, houseID int32) error // Player house operations LoadPlayerHouses(ctx context.Context, characterID int32) ([]PlayerHouseData, error) LoadPlayerHouse(ctx context.Context, uniqueID int64) (*PlayerHouseData, error) SavePlayerHouse(ctx context.Context, house *PlayerHouse) error DeletePlayerHouse(ctx context.Context, uniqueID int64) error AddPlayerHouse(ctx context.Context, houseData PlayerHouseData) (int64, error) // Deposit operations LoadDeposits(ctx context.Context, houseID int64) ([]HouseDepositData, error) SaveDeposit(ctx context.Context, houseID int64, deposit HouseDeposit) error // History operations LoadHistory(ctx context.Context, houseID int64) ([]HouseHistoryData, error) AddHistory(ctx context.Context, houseID int64, history HouseHistory) error // Access operations LoadHouseAccess(ctx context.Context, houseID int64) ([]HouseAccessData, error) SaveHouseAccess(ctx context.Context, houseID int64, access []HouseAccess) error DeleteHouseAccess(ctx context.Context, houseID int64, characterID int32) error // Amenity operations LoadHouseAmenities(ctx context.Context, houseID int64) ([]HouseAmenityData, error) SaveHouseAmenity(ctx context.Context, houseID int64, amenity HouseAmenity) error DeleteHouseAmenity(ctx context.Context, houseID int64, amenityID int32) error // Item operations LoadHouseItems(ctx context.Context, houseID int64) ([]HouseItemData, error) SaveHouseItem(ctx context.Context, houseID int64, item HouseItem) error DeleteHouseItem(ctx context.Context, houseID int64, itemID int64) error // Utility operations GetNextHouseID(ctx context.Context) (int64, error) GetHouseByInstance(ctx context.Context, instanceID int32) (*PlayerHouseData, error) UpdateHouseUpkeepDue(ctx context.Context, houseID int64, upkeepDue time.Time) error UpdateHouseEscrow(ctx context.Context, houseID int64, coins, status int64) error GetHousesForUpkeep(ctx context.Context, cutoffTime time.Time) ([]PlayerHouseData, error) GetHouseStatistics(ctx context.Context) (*HousingStatistics, error) EnsureHousingTables(ctx context.Context) error } // HousingEventHandler defines the interface for handling housing events type HousingEventHandler interface { // House lifecycle events OnHousePurchased(house *PlayerHouse, purchaser int32, cost int64, statusCost int64) OnHouseForeclosed(house *PlayerHouse, reason string) OnHouseTransferred(house *PlayerHouse, fromCharacterID, toCharacterID int32) OnHouseAbandoned(house *PlayerHouse, characterID int32) // Financial events OnDepositMade(house *PlayerHouse, characterID int32, amount int64, status int64) OnWithdrawalMade(house *PlayerHouse, characterID int32, amount int64, status int64) OnUpkeepPaid(house *PlayerHouse, amount int64, status int64, automatic bool) OnUpkeepOverdue(house *PlayerHouse, daysPastDue int) // Access events OnAccessGranted(house *PlayerHouse, grantedTo int32, grantedBy int32, accessLevel int8) OnAccessRevoked(house *PlayerHouse, revokedFrom int32, revokedBy int32) OnPlayerEntered(house *PlayerHouse, characterID int32) OnPlayerExited(house *PlayerHouse, characterID int32) // Item events OnItemPlaced(house *PlayerHouse, item *HouseItem, placedBy int32) OnItemRemoved(house *PlayerHouse, item *HouseItem, removedBy int32) OnItemMoved(house *PlayerHouse, item *HouseItem, movedBy int32) // Amenity events OnAmenityPurchased(house *PlayerHouse, amenity *HouseAmenity, purchasedBy int32) OnAmenityRemoved(house *PlayerHouse, amenity *HouseAmenity, removedBy int32) } // ClientManager defines the interface for client communication type ClientManager interface { // Send housing packets to clients SendHousePurchase(characterID int32, data *HousePurchasePacketData) error SendHousingList(characterID int32, data *HouseListPacketData) error SendBaseHouseWindow(characterID int32, data *BaseHouseWindowPacketData) error SendHouseVisitWindow(characterID int32, data *HouseVisitPacketData) error SendHouseUpdate(characterID int32, house *PlayerHouse) error SendHouseError(characterID int32, errorCode int, message string) error // Broadcast to multiple clients BroadcastHouseUpdate(characterIDs []int32, house *PlayerHouse) error BroadcastHouseEvent(characterIDs []int32, eventType int, data string) error // Client validation IsClientConnected(characterID int32) bool GetClientVersion(characterID int32) int } // PlayerManager defines the interface for player system integration type PlayerManager interface { // Get player information GetPlayerInfo(characterID int32) (*PlayerInfo, error) GetPlayerName(characterID int32) string GetPlayerAlignment(characterID int32) int8 GetPlayerGuildLevel(characterID int32) int8 IsPlayerOnline(characterID int32) bool // Player finances GetPlayerCoins(characterID int32) (int64, error) GetPlayerStatus(characterID int32) (int64, error) DeductPlayerCoins(characterID int32, amount int64) error DeductPlayerStatus(characterID int32, amount int64) error AddPlayerCoins(characterID int32, amount int64) error AddPlayerStatus(characterID int32, amount int64) error // Player validation CanPlayerAffordHouse(characterID int32, cost int64, statusCost int64) (bool, error) ValidatePlayerExists(playerName string) (int32, error) } // ItemManager defines the interface for item system integration type ItemManager interface { // Item operations GetItemInfo(itemID int32) (*ItemInfo, error) ValidateItemPlacement(itemID int32, x, y, z float32) error CreateHouseItem(itemID int32, characterID int32, quantity int32) (*HouseItem, error) RemoveItemFromPlayer(characterID int32, itemID int32, quantity int32) error ReturnItemToPlayer(characterID int32, item *HouseItem) error // Item queries IsItemPlaceable(itemID int32) bool GetItemWeight(itemID int32) float32 GetItemValue(itemID int32) int64 } // ZoneManager defines the interface for zone system integration type ZoneManager interface { // Zone operations GetZoneInfo(zoneID int32) (*ZoneInfo, error) CreateHouseInstance(houseID int32, ownerID int32) (int32, error) DestroyHouseInstance(instanceID int32) error GetHouseInstance(instanceID int32) (*HouseInstance, error) // Player zone operations MovePlayerToHouse(characterID int32, instanceID int32) error GetPlayersInHouse(instanceID int32) ([]int32, error) IsPlayerInHouse(characterID int32) (bool, int32) // Zone validation IsHouseZoneValid(zoneID int32) bool GetHouseSpawnPoint(instanceID int32) (float32, float32, float32, float32, error) } // LogHandler defines the interface for logging operations type LogHandler interface { LogDebug(system, format string, args ...any) LogInfo(system, format string, args ...any) LogWarning(system, format string, args ...any) LogError(system, format string, args ...any) } // Additional integration interfaces // PlayerInfo contains player details needed for housing system type PlayerInfo struct { CharacterID int32 `json:"character_id"` CharacterName string `json:"character_name"` AccountID int32 `json:"account_id"` AdventureLevel int16 `json:"adventure_level"` Alignment int8 `json:"alignment"` GuildID int32 `json:"guild_id"` GuildLevel int8 `json:"guild_level"` Zone string `json:"zone"` IsOnline bool `json:"is_online"` HouseZoneID int32 `json:"house_zone_id"` } // ItemInfo contains item details for placement validation type ItemInfo struct { ID int32 `json:"id"` Name string `json:"name"` Description string `json:"description"` Icon int16 `json:"icon"` Weight float32 `json:"weight"` Value int64 `json:"value"` IsPlaceable bool `json:"is_placeable"` MaxStack int32 `json:"max_stack"` Type int8 `json:"type"` } // ZoneInfo contains zone details for house instances type ZoneInfo struct { ID int32 `json:"id"` Name string `json:"name"` Description string `json:"description"` Type int8 `json:"type"` MinLevel int16 `json:"min_level"` MaxLevel int16 `json:"max_level"` SafeX float32 `json:"safe_x"` SafeY float32 `json:"safe_y"` SafeZ float32 `json:"safe_z"` SafeHeading float32 `json:"safe_heading"` } // HouseInstance contains active house instance information type HouseInstance struct { InstanceID int32 `json:"instance_id"` HouseID int64 `json:"house_id"` OwnerID int32 `json:"owner_id"` ZoneID int32 `json:"zone_id"` CreatedTime time.Time `json:"created_time"` LastActivity time.Time `json:"last_activity"` CurrentVisitors []int32 `json:"current_visitors"` IsActive bool `json:"is_active"` } // Adapter interfaces for integration with existing systems // HousingAware defines interface for entities that can interact with housing type HousingAware interface { GetCharacterID() int32 GetPlayerName() string GetAlignment() int8 GetGuildLevel() int8 CanAffordCost(coins int64, status int64) bool GetCurrentZone() int32 } // EntityHousingAdapter adapts entity system for housing integration type EntityHousingAdapter struct { entity HousingAware } // PacketBuilder defines interface for building housing packets type PacketBuilder interface { BuildHousePurchasePacket(data *HousePurchasePacketData) ([]byte, error) BuildHousingListPacket(data *HouseListPacketData) ([]byte, error) BuildBaseHouseWindowPacket(data *BaseHouseWindowPacketData) ([]byte, error) BuildHouseVisitPacket(data *HouseVisitPacketData) ([]byte, error) BuildHouseUpdatePacket(house *PlayerHouse) ([]byte, error) BuildHouseErrorPacket(errorCode int, message string) ([]byte, error) } // UpkeepManager defines interface for upkeep processing type UpkeepManager interface { ProcessUpkeep(ctx context.Context) error ProcessForeclosures(ctx context.Context) error SendUpkeepNotices(ctx context.Context) error CalculateUpkeep(house *PlayerHouse, zone *HouseZone) (int64, int64, error) CanPayUpkeep(house *PlayerHouse, coinCost, statusCost int64) bool ProcessPayment(ctx context.Context, house *PlayerHouse, coinCost, statusCost int64) error } // StatisticsCollector defines interface for collecting housing statistics type StatisticsCollector interface { RecordHousePurchase(houseType int32, cost int64, statusCost int64) RecordDeposit(houseID int64, amount int64, status int64) RecordWithdrawal(houseID int64, amount int64, status int64) RecordUpkeepPayment(houseID int64, amount int64, status int64) RecordForeclosure(houseID int64, reason string) GetStatistics() *HousingStatistics Reset() } // AccessManager defines interface for managing house access type AccessManager interface { GrantAccess(ctx context.Context, house *PlayerHouse, characterID int32, accessLevel int8, permissions int32) error RevokeAccess(ctx context.Context, house *PlayerHouse, characterID int32) error CheckAccess(house *PlayerHouse, characterID int32, requiredPermission int32) bool GetAccessLevel(house *PlayerHouse, characterID int32) int8 GetPermissions(house *PlayerHouse, characterID int32) int32 UpdateAccess(ctx context.Context, house *PlayerHouse, characterID int32, accessLevel int8, permissions int32) error } // ConfigManager defines interface for configuration management type ConfigManager interface { GetHousingConfig() *HousingConfig UpdateHousingConfig(config *HousingConfig) error GetConfigValue(key string) any SetConfigValue(key string, value any) error } // NotificationManager defines interface for housing notifications type NotificationManager interface { SendUpkeepReminder(characterID int32, house *PlayerHouse, daysRemaining int) SendForeclosureWarning(characterID int32, house *PlayerHouse, daysRemaining int) SendAccessGrantedNotification(characterID int32, house *PlayerHouse, grantedBy int32) SendAccessRevokedNotification(characterID int32, house *PlayerHouse, revokedBy int32) SendHouseVisitorNotification(ownerID int32, visitorID int32, house *PlayerHouse) } // CacheManager defines interface for caching operations type CacheManager interface { // Cache operations Set(key string, value any, expiration time.Duration) error Get(key string) (any, bool) Delete(key string) error Clear() error // House-specific cache operations CachePlayerHouses(characterID int32, houses []*PlayerHouse) error GetCachedPlayerHouses(characterID int32) ([]*PlayerHouse, bool) InvalidateHouseCache(houseID int64) error } // SearchManager defines interface for house searching type SearchManager interface { SearchHouses(criteria HousingSearchCriteria) ([]*PlayerHouse, error) SearchHouseZones(criteria HousingSearchCriteria) ([]*HouseZone, error) GetPopularHouses(limit int) ([]*PlayerHouse, error) GetRecentHouses(limit int) ([]*PlayerHouse, error) IndexHouseForSearch(house *PlayerHouse) error RemoveHouseFromIndex(houseID int64) error }