package object // import "github.com/SevereCloud/vksdk/v2/object"

import (
	"bytes"
	"encoding/json"

	"github.com/vmihailenco/msgpack/v5"
	"github.com/vmihailenco/msgpack/v5/msgpcode"
)

// UtilsDomainResolvedType object type.
const (
	UtilsDomainResolvedTypeUser        = "user"
	UtilsDomainResolvedTypeGroup       = "group"
	UtilsDomainResolvedTypeApplication = "application"
	UtilsDomainResolvedTypePage        = "page"
	UtilsDomainResolvedTypeVkApp       = "vk_app"
)

// UtilsDomainResolved struct.
type UtilsDomainResolved struct {
	ObjectID int    `json:"object_id"` // Object ID
	Type     string `json:"type"`
}

// UnmarshalJSON UtilsDomainResolved.
//
// BUG(VK): UtilsDomainResolved return [].
func (link *UtilsDomainResolved) UnmarshalJSON(data []byte) error {
	if bytes.Equal(data, []byte("[]")) {
		return nil
	}

	type renamedUtilsDomainResolved UtilsDomainResolved

	var r renamedUtilsDomainResolved

	err := json.Unmarshal(data, &r)
	if err != nil {
		return err
	}

	*link = UtilsDomainResolved(r)

	return nil
}

// DecodeMsgpack UtilsDomainResolved.
//
// BUG(VK): UtilsDomainResolved return [].
func (link *UtilsDomainResolved) DecodeMsgpack(dec *msgpack.Decoder) error {
	data, err := dec.DecodeRaw()
	if err != nil {
		return err
	}

	if bytes.Equal(data, []byte{msgpcode.FixedArrayLow}) {
		return nil
	}

	type renamedUtilsDomainResolved UtilsDomainResolved

	var r renamedUtilsDomainResolved

	d := msgpack.NewDecoder(bytes.NewReader(data))
	d.SetCustomStructTag("json")

	err = d.Decode(&r)
	if err != nil {
		return err
	}

	*link = UtilsDomainResolved(r)

	return nil
}

// UtilsLastShortenedLink struct.
type UtilsLastShortenedLink struct {
	AccessKey string `json:"access_key"` // Access key for private stats
	Key       string `json:"key"`        // Link key (characters after vk.cc/)
	ShortURL  string `json:"short_url"`  // Short link URL
	Timestamp int    `json:"timestamp"`  // Creation time in Unixtime
	URL       string `json:"url"`        // Full URL
	Views     int    `json:"views"`      // Total views number
}

// Link status.
const (
	UtilsLinkCheckedStatusNotBanned  = "not_banned"
	UtilsLinkCheckedStatusBanned     = "banned"
	UtilsLinkCheckedStatusProcessing = "processing"
)

// UtilsLinkChecked struct.
type UtilsLinkChecked struct {
	Link   string `json:"link"` // Link URL
	Status string `json:"status"`
}

// UtilsLinkStats struct.
type UtilsLinkStats struct {
	Key   string       `json:"key"` // Link key (characters after vk.cc/)
	Stats []UtilsStats `json:"stats"`
}

// UtilsLinkStatsExtended struct.
type UtilsLinkStatsExtended struct {
	Key   string               `json:"key"` // Link key (characters after vk.cc/)
	Stats []UtilsStatsExtended `json:"stats"`
}

// UtilsShortLink struct.
type UtilsShortLink struct {
	AccessKey string `json:"access_key"` // Access key for private stats
	Key       string `json:"key"`        // Link key (characters after vk.cc/)
	ShortURL  string `json:"short_url"`  // Short link URL
	URL       string `json:"url"`        // Full URL
}

// UtilsStats struct.
type UtilsStats struct {
	Timestamp int `json:"timestamp"` // Start time
	Views     int `json:"views"`     // Total views number
}

// UtilsStatsCity struct.
type UtilsStatsCity struct {
	CityID int `json:"city_id"` // City ID
	Views  int `json:"views"`   // Views number
}

// UtilsStatsCountry struct.
type UtilsStatsCountry struct {
	CountryID int `json:"country_id"` // Country ID
	Views     int `json:"views"`      // Views number
}

// UtilsStatsExtended struct.
type UtilsStatsExtended struct {
	Cities    []UtilsStatsCity    `json:"cities"`
	Countries []UtilsStatsCountry `json:"countries"`
	SexAge    []UtilsStatsSexAge  `json:"sex_age"`
	Timestamp int                 `json:"timestamp"` // Start time
	Views     int                 `json:"views"`     // Total views number
}

// UtilsStatsSexAge struct.
type UtilsStatsSexAge struct {
	AgeRange string `json:"age_range"` // Age denotation
	Female   int    `json:"female"`    //  Views by female users
	Male     int    `json:"male"`      //  Views by male users
}