package housing

// Housing System Constants
const (
	// Access levels for housing
	AccessLevelOwner = iota
	AccessLevelFriend
	AccessLevelVisitor
	AccessLevelGuildMember
	AccessLevelBanned

	// House alignment requirements
	AlignmentAny     = 0
	AlignmentGood    = 1
	AlignmentEvil    = 2
	AlignmentNeutral = 3

	// Transaction types for house history
	TransactionPurchase       = 1
	TransactionUpkeep         = 2
	TransactionDeposit        = 3
	TransactionWithdrawal     = 4
	TransactionAmenity        = 5
	TransactionVaultExpansion = 6
	TransactionRent           = 7
	TransactionForeclosure    = 8
	TransactionTransfer       = 9
	TransactionRepair         = 10

	// History position flags
	HistoryFlagPositive = 1
	HistoryFlagNegative = 0

	// Upkeep periods (in seconds)
	UpkeepPeriodWeekly  = 604800  // 7 days
	UpkeepPeriodMonthly = 2592000 // 30 days
	UpkeepGracePeriod   = 259200  // 3 days

	// House status flags
	HouseStatusActive     = 0
	HouseStatusUpkeepDue  = 1
	HouseStatusForeclosed = 2
	HouseStatusAbandoned  = 3

	// Maximum values
	MaxHouseName          = 64
	MaxReasonLength       = 255
	MaxDepositHistory     = 100
	MaxTransactionHistory = 500
	MaxVaultSlots         = 200
	MaxAmenities          = 50
	MaxAccessEntries      = 100

	// Database retry settings
	MaxDatabaseRetries = 3
	DatabaseTimeout    = 30 // seconds

	// Escrow limits
	MaxEscrowCoins  = 1000000000 // 1 billion copper
	MaxEscrowStatus = 10000000   // 10 million status

	// Visit permissions
	VisitPermissionPublic     = 0
	VisitPermissionFriends    = 1
	VisitPermissionGuild      = 2
	VisitPermissionInviteOnly = 3
	VisitPermissionPrivate    = 4

	// Housing opcodes/packet types
	OpHousePurchase     = "PlayerHousePurchase"
	OpHousingList       = "CharacterHousingList"
	OpBaseHouseWindow   = "PlayerHouseBaseScreen"
	OpHouseVisitWindow  = "PlayerHouseVisit"
	OpBuyHouse          = "BuyHouse"
	OpEnterHouse        = "EnterHouse"
	OpUpdateHouseAccess = "UpdateHouseAccessDataMsg"
	OpHouseDeposit      = "HouseDeposit"
	OpHouseWithdrawal   = "HouseWithdrawal"
	OpPlaceItem         = "PlaceItemInHouse"
	OpRemoveItem        = "RemoveItemFromHouse"
	OpUpdateAmenities   = "UpdateHouseAmenities"

	// Error messages
	ErrHouseNotFound         = "house not found"
	ErrInsufficientFunds     = "insufficient funds"
	ErrInsufficientStatus    = "insufficient status points"
	ErrAccessDenied          = "access denied"
	ErrHouseNotOwned         = "house not owned by player"
	ErrAlignmentRestriction  = "alignment requirement not met"
	ErrGuildLevelRestriction = "guild level requirement not met"
	ErrUpkeepOverdue         = "house upkeep is overdue"
	ErrHouseForeclosed       = "house has been foreclosed"
	ErrInvalidHouseType      = "invalid house type"
	ErrDuplicateHouse        = "player already owns this house type"
	ErrMaxHousesReached      = "maximum number of houses reached"

	// Default upkeep costs (can be overridden per house type)
	DefaultUpkeepCoins  = 10000 // 1 gold
	DefaultUpkeepStatus = 100

	// Item placement constants
	MaxItemsPerHouse    = 1000
	MaxItemStackSize    = 100
	ItemPlacementRadius = 50.0 // Maximum distance from spawn point

	// House zones configuration
	DefaultInstanceLifetime = 3600 // 1 hour in seconds
	MaxHouseVisitors        = 50   // Maximum concurrent visitors

	// Amenity types
	AmenityVaultExpansion = 1
	AmenityPortal         = 2
	AmenityMerchant       = 3
	AmenityRepairNPC      = 4
	AmenityBroker         = 5
	AmenityBanker         = 6
	AmenityManagedItems   = 7
	AmenityTeleporter     = 8

	// Foreclosure settings
	ForeclosureWarningDays = 7 // Days before foreclosure
	ForeclosureNoticeDays  = 3 // Days of final notice

	// Deposit limits
	MinDepositAmount = 1
	MaxDepositAmount = 10000000 // 1000 gold

	// Search and filtering
	MaxSearchResults = 100
	SearchTimeout    = 5 // seconds
)

// House type constants for common house types
const (
	HouseTypeInn          = 1
	HouseTypeCottage      = 2
	HouseTypeApartment    = 3
	HouseTypeHouse        = 4
	HouseTypeMansion      = 5
	HouseTypeKeep         = 6
	HouseTypeGuildHall    = 7
	HouseTypePrestigeHome = 8
)

// Access permission flags (bitwise)
const (
	PermissionEnter    = 1 << iota // Can enter the house
	PermissionPlace    = 1 << iota // Can place items
	PermissionRemove   = 1 << iota // Can remove items
	PermissionMove     = 1 << iota // Can move items
	PermissionVault    = 1 << iota // Can access vault
	PermissionDeposit  = 1 << iota // Can make deposits
	PermissionWithdraw = 1 << iota // Can make withdrawals
	PermissionInvite   = 1 << iota // Can invite others
	PermissionKick     = 1 << iota // Can kick visitors
	PermissionAdmin    = 1 << iota // Full administrative access
)

// Default permission sets
const (
	PermissionsOwner = PermissionEnter | PermissionPlace | PermissionRemove |
		PermissionMove | PermissionVault | PermissionDeposit |
		PermissionWithdraw | PermissionInvite | PermissionKick | PermissionAdmin

	PermissionsFriend = PermissionEnter | PermissionPlace | PermissionMove |
		PermissionVault | PermissionDeposit

	PermissionsVisitor = PermissionEnter

	PermissionsGuildMember = PermissionEnter | PermissionPlace | PermissionDeposit

	PermissionsBanned = 0
)

// Alignment names for display
var AlignmentNames = map[int8]string{
	AlignmentAny:     "Any",
	AlignmentGood:    "Good",
	AlignmentEvil:    "Evil",
	AlignmentNeutral: "Neutral",
}

// Transaction reason descriptions
var TransactionReasons = map[int]string{
	TransactionPurchase:       "House Purchase",
	TransactionUpkeep:         "Upkeep Payment",
	TransactionDeposit:        "Escrow Deposit",
	TransactionWithdrawal:     "Escrow Withdrawal",
	TransactionAmenity:        "Amenity Purchase",
	TransactionVaultExpansion: "Vault Expansion",
	TransactionRent:           "Rent Payment",
	TransactionForeclosure:    "Foreclosure",
	TransactionTransfer:       "House Transfer",
	TransactionRepair:         "House Repair",
}

// Amenity names for display
var AmenityNames = map[int]string{
	AmenityVaultExpansion: "Vault Expansion",
	AmenityPortal:         "Portal",
	AmenityMerchant:       "Merchant",
	AmenityRepairNPC:      "Repair NPC",
	AmenityBroker:         "Broker",
	AmenityBanker:         "Banker",
	AmenityManagedItems:   "Managed Items",
	AmenityTeleporter:     "Teleporter",
}

// House type names for display
var HouseTypeNames = map[int]string{
	HouseTypeInn:          "Inn Room",
	HouseTypeCottage:      "Cottage",
	HouseTypeApartment:    "Apartment",
	HouseTypeHouse:        "House",
	HouseTypeMansion:      "Mansion",
	HouseTypeKeep:         "Keep",
	HouseTypeGuildHall:    "Guild Hall",
	HouseTypePrestigeHome: "Prestige Home",
}

// Default costs for house types (in copper coins)
var DefaultHouseCosts = map[int]int64{
	HouseTypeInn:          50000,     // 5 gold
	HouseTypeCottage:      200000,    // 20 gold
	HouseTypeApartment:    500000,    // 50 gold
	HouseTypeHouse:        1000000,   // 100 gold
	HouseTypeMansion:      5000000,   // 500 gold
	HouseTypeKeep:         10000000,  // 1000 gold
	HouseTypeGuildHall:    50000000,  // 5000 gold
	HouseTypePrestigeHome: 100000000, // 10000 gold
}

// Default status costs for house types
var DefaultHouseStatusCosts = map[int]int64{
	HouseTypeInn:          0,
	HouseTypeCottage:      0,
	HouseTypeApartment:    100,
	HouseTypeHouse:        500,
	HouseTypeMansion:      2500,
	HouseTypeKeep:         5000,
	HouseTypeGuildHall:    25000,
	HouseTypePrestigeHome: 50000,
}

// Default upkeep costs (in copper coins per week)
var DefaultHouseUpkeepCosts = map[int]int64{
	HouseTypeInn:          5000,    // 50 silver
	HouseTypeCottage:      10000,   // 1 gold
	HouseTypeApartment:    25000,   // 2.5 gold
	HouseTypeHouse:        50000,   // 5 gold
	HouseTypeMansion:      100000,  // 10 gold
	HouseTypeKeep:         200000,  // 20 gold
	HouseTypeGuildHall:    500000,  // 50 gold
	HouseTypePrestigeHome: 1000000, // 100 gold
}

// Default vault slots per house type
var DefaultVaultSlots = map[int]int{
	HouseTypeInn:          4,
	HouseTypeCottage:      6,
	HouseTypeApartment:    8,
	HouseTypeHouse:        12,
	HouseTypeMansion:      16,
	HouseTypeKeep:         20,
	HouseTypeGuildHall:    24,
	HouseTypePrestigeHome: 32,
}
