package locode

import (
	"git.frostfs.info/TrueCloudLab/frostfs-locode-db/pkg/locode"
	locodedb "git.frostfs.info/TrueCloudLab/frostfs-locode-db/pkg/locode/db"
)

// Record is an interface of read-only
// FrostFS LOCODE database single entry.
type Record interface {
	// CountryCode must return ISO 3166-1 alpha-2
	// country code.
	//
	// Must not return nil.
	CountryCode() *locodedb.CountryCode

	// CountryName must return English short country name
	// officially used by the ISO 3166
	// Maintenance Agency (ISO 3166/MA).
	CountryName() string

	// LocationCode must return UN/LOCODE 3-character code
	// for the location (numerals 2-9 may also
	// be used).
	//
	// Must not return nil.
	LocationCode() *locodedb.LocationCode

	// LocationName must return name of the location which
	// have been allocated a UN/LOCODE without
	// diacritic sign.
	LocationName() string

	// SubDivCode Must return ISO 1-3 character alphabetic
	// and/or numeric code for the administrative
	// division of the country concerned.
	SubDivCode() string

	// SubDivName must return subdivision name.
	SubDivName() string

	// Continent must return existing continent where is
	// the location.
	//
	// Must not return nil.
	Continent() *locodedb.Continent
}

// DB is an interface of read-only
// FrostFS LOCODE database.
type DB interface {
	// Get must find the record that corresponds to
	// LOCODE and provides the Record interface.
	//
	// Must return an error if Record is nil.
	//
	// LOCODE is always non-nil.
	Get(*locode.LOCODE) (Record, error)
}