package requests

import (
	"time"

	"github.com/shopspring/decimal"
)

// CreateResidenceRequest represents the request to create a residence
type CreateResidenceRequest struct {
	Name           string           `json:"name" validate:"required,min=1,max=200"`
	PropertyTypeID *uint            `json:"property_type_id"`
	StreetAddress  string           `json:"street_address" validate:"max=255"`
	ApartmentUnit  string           `json:"apartment_unit" validate:"max=50"`
	City           string           `json:"city" validate:"max=100"`
	StateProvince  string           `json:"state_province" validate:"max=100"`
	PostalCode     string           `json:"postal_code" validate:"max=20"`
	Country        string           `json:"country" validate:"max=100"`
	Bedrooms       *int             `json:"bedrooms" validate:"omitempty,min=0"`
	Bathrooms      *decimal.Decimal `json:"bathrooms"`
	SquareFootage  *int             `json:"square_footage" validate:"omitempty,min=0"`
	LotSize        *decimal.Decimal `json:"lot_size"`
	YearBuilt      *int             `json:"year_built"`
	Description    string           `json:"description" validate:"max=10000"`
	PurchaseDate   *time.Time       `json:"purchase_date"`
	PurchasePrice  *decimal.Decimal `json:"purchase_price"`
	IsPrimary      *bool            `json:"is_primary"`

	// Home Profile
	HeatingType        *string `json:"heating_type" validate:"omitempty,oneof=gas_furnace electric_furnace heat_pump boiler radiant other"`
	CoolingType        *string `json:"cooling_type" validate:"omitempty,oneof=central_ac window_ac heat_pump evaporative none other"`
	WaterHeaterType    *string `json:"water_heater_type" validate:"omitempty,oneof=tank_gas tank_electric tankless_gas tankless_electric heat_pump solar other"`
	RoofType           *string `json:"roof_type" validate:"omitempty,oneof=asphalt_shingle metal tile slate wood_shake flat other"`
	HasPool            *bool   `json:"has_pool"`
	HasSprinklerSystem *bool   `json:"has_sprinkler_system"`
	HasSeptic          *bool   `json:"has_septic"`
	HasFireplace       *bool   `json:"has_fireplace"`
	HasGarage          *bool   `json:"has_garage"`
	HasBasement        *bool   `json:"has_basement"`
	HasAttic           *bool   `json:"has_attic"`
	ExteriorType       *string `json:"exterior_type" validate:"omitempty,oneof=brick vinyl_siding wood_siding stucco stone fiber_cement other"`
	FlooringPrimary    *string `json:"flooring_primary" validate:"omitempty,oneof=hardwood laminate tile carpet vinyl concrete other"`
	LandscapingType    *string `json:"landscaping_type" validate:"omitempty,oneof=lawn desert xeriscape garden mixed none other"`
}

// UpdateResidenceRequest represents the request to update a residence
type UpdateResidenceRequest struct {
	Name           *string          `json:"name" validate:"omitempty,min=1,max=200"`
	PropertyTypeID *uint            `json:"property_type_id"`
	StreetAddress  *string          `json:"street_address" validate:"omitempty,max=255"`
	ApartmentUnit  *string          `json:"apartment_unit" validate:"omitempty,max=50"`
	City           *string          `json:"city" validate:"omitempty,max=100"`
	StateProvince  *string          `json:"state_province" validate:"omitempty,max=100"`
	PostalCode     *string          `json:"postal_code" validate:"omitempty,max=20"`
	Country        *string          `json:"country" validate:"omitempty,max=100"`
	Bedrooms       *int             `json:"bedrooms" validate:"omitempty,min=0"`
	Bathrooms      *decimal.Decimal `json:"bathrooms"`
	SquareFootage  *int             `json:"square_footage" validate:"omitempty,min=0"`
	LotSize        *decimal.Decimal `json:"lot_size"`
	YearBuilt      *int             `json:"year_built"`
	Description    *string          `json:"description" validate:"omitempty,max=10000"`
	PurchaseDate   *time.Time       `json:"purchase_date"`
	PurchasePrice  *decimal.Decimal `json:"purchase_price"`
	IsPrimary      *bool            `json:"is_primary"`

	// Home Profile
	HeatingType        *string `json:"heating_type" validate:"omitempty,oneof=gas_furnace electric_furnace heat_pump boiler radiant other"`
	CoolingType        *string `json:"cooling_type" validate:"omitempty,oneof=central_ac window_ac heat_pump evaporative none other"`
	WaterHeaterType    *string `json:"water_heater_type" validate:"omitempty,oneof=tank_gas tank_electric tankless_gas tankless_electric heat_pump solar other"`
	RoofType           *string `json:"roof_type" validate:"omitempty,oneof=asphalt_shingle metal tile slate wood_shake flat other"`
	HasPool            *bool   `json:"has_pool"`
	HasSprinklerSystem *bool   `json:"has_sprinkler_system"`
	HasSeptic          *bool   `json:"has_septic"`
	HasFireplace       *bool   `json:"has_fireplace"`
	HasGarage          *bool   `json:"has_garage"`
	HasBasement        *bool   `json:"has_basement"`
	HasAttic           *bool   `json:"has_attic"`
	ExteriorType       *string `json:"exterior_type" validate:"omitempty,oneof=brick vinyl_siding wood_siding stucco stone fiber_cement other"`
	FlooringPrimary    *string `json:"flooring_primary" validate:"omitempty,oneof=hardwood laminate tile carpet vinyl concrete other"`
	LandscapingType    *string `json:"landscaping_type" validate:"omitempty,oneof=lawn desert xeriscape garden mixed none other"`
}

// JoinWithCodeRequest represents the request to join a residence via share code
type JoinWithCodeRequest struct {
	Code string `json:"code" validate:"required,len=6"`
}

// GenerateShareCodeRequest represents the request to generate a share code
type GenerateShareCodeRequest struct {
	ExpiresInHours int `json:"expires_in_hours" validate:"omitempty,min=1"` // Default: 24 hours
}
