###################################
# Hosts, items + groups, templates
###################################

"""
Represents a host group in Zabbix.
"""
type HostGroup {
    """
    Internal Zabbix ID of the host group.
    """
    groupid: ID!
    """
    Name of the host group.
    """
    name: String
}

"""
Common interface for all host-like entities in Zabbix.
"""
interface Host {
    """
    Internal Zabbix ID of the host.
    """
    hostid: ID!
    """
    Technical name of the host (the 'hostname' in Zabbix).
    """
    host: String!
    """
    List of host groups this host belongs to.
    """
    hostgroups: [HostGroup!]
    """
    Visible name of the host.
    """
    name: String
    """
    Specifies the type or category of the device. Used to define the classification
    of a device in the system (capabilities, functionalities, or purpose).
    """
    deviceType: String
    """
    Host inventory data.
    """
    inventory: Inventory
    """
    List of monitored items for this host.
    """
    items: [ZabbixItem!]
}

"""
Represents a Zabbix item (a single data point being monitored).
"""
type ZabbixItem {
    """
    Internal Zabbix ID of the item.
    """
    itemid: Int!
    """
    Visible name of the item.
    """
    name: String!
    """
    Technical key of the item.
    """
    key_: String!
    """
    Internal Zabbix ID of the host this item belongs to.
    """
    hostid: Int
    """
    Unix timestamp of the last time the item value was updated.
    """
    lastclock: Int
    """
    Last value retrieved for this item.
    """
    lastvalue: String
    """
    Error message if the item is in an error state.
    """
    error: String
    """
    Type of information (e.g. 0 for Float, 3 for Int, 4 for Text).
    """
    value_type: Int!
    """
    Attribute name if this item is part of a hierarchical mapping.
    """
    attributeName: String
    """
    Status of the item (ENABLED or DISABLED).
    """
    status: DeviceStatus
    """
    Communication type used by the item.
    """
    type: DeviceCommunicationType
    """
    Raw Zabbix item type as integer.
    """
    type_int: Int
    """
    Raw Zabbix item status as integer.
    """
    status_int: Int
    """
    Hosts that this item is linked to.
    """
    hosts: [Host!]
    """
    History storage period (e.g. '2d', '90d').
    """
    history: String
    """
    Update interval.
    """
    delay: String
    """
    Units of the value.
    """
    units: String
    """
    Description of the item.
    """
    description: String
    """
    Preprocessing steps for the item.
    """
    preprocessing: [JSONObject!]
    """
    Tags assigned to the item.
    """
    tags: [JSONObject!]
    """
    Master item ID for dependent items.
    """
    master_itemid: Int
    """
    Master item for dependent items.
    """
    master_item: ZabbixItem
}

"""
Enum representing the different communication methods Zabbix uses to collect data.
"""
enum DeviceCommunicationType {
    """Zabbix agent."""
    ZABBIX_AGENT
    """Zabbix agent (active)."""
    ZABBIX_AGENT_ACTIVE
    """Zabbix trapper."""
    ZABBIX_TRAP
    """Zabbix internal."""
    ZABBIX_INTERNAL_ITEM
    """Simple check."""
    SIMPLE_CHECK
    """Dependent item."""
    DEPENDANT_ITEM
    """Calculated item."""
    SIMULATOR_CALCULATED
    """JavaScript item."""
    SIMULATOR_JAVASCRIPT
    """HTTP agent."""
    HTTP_AGENT
    """IPMI agent."""
    IPMI_AGENT
    """JMX agent."""
    JMX_AGENT
    """SNMP agent."""
    SNMP_AGENT
    """SNMP trap."""
    SNMP_TRAP
    """Database monitor."""
    DATABASE_MONITOR
}

"""
Concrete implementation of a Zabbix host.
"""
type ZabbixHost implements Host {
    """
    Internal Zabbix ID of the host.
    """
    hostid: ID!
    """
    Technical name of the host.
    """
    host: String!
    """
    List of host groups this host belongs to.
    """
    hostgroups: [HostGroup!]
    """
    Visible name of the host.
    """
    name: String
    """
    Tags assigned to the host as a JSON object.
    """
    tags: JSONObject

    """
    Specifies the type or category of the device. Used to define the classification
    of a device in the system (capabilities, functionalities, or purpose).
    """
    deviceType: String

    """
    List of monitored items for this host.
    """
    items: [ZabbixItem!]
    """
    Host inventory data.
    """
    inventory: Inventory
    """
    List of templates linked to this host.
    """
    parentTemplates: [Template!]
}


"""
Represents a Zabbix template.
"""
type Template {
    """
    Internal Zabbix ID of the template.
    """
    templateid: String!
    """
    Technical name of the template.
    """
    host: String!
    """
    Name of the template.
    """
    name: String
    """
    List of items for this template.
    """
    items: [ZabbixItem!]
}

"""
Represents host inventory information.
"""
type Inventory {
    """
    Location data for the host.
    """
    location: Location
}

"""
Interface for entities that have GPS coordinates.
Hint: WGS84[dd.ddddd] coordinates are used.
"""
interface GpsPosition {
    """
    Latitude coordinate.
    """
    latitude: Float
    """
    Longitude coordinate.
    """
    longitude: Float
}

"""
Represents a geographical location.
"""
type Location implements GpsPosition {
    """
    Name of the location.
    """
    name: String
    """
    Latitude coordinate.
    """
    latitude: Float
    """
    Longitude coordinate.
    """
    longitude: Float
}

"""
Status of a Zabbix device/item.
"""
enum DeviceStatus {
    """The device/item is enabled."""
    ENABLED
    """The device/item is disabled."""
    DISABLED
}

########################################################
#  History / Values
########################################################

"""
Enum representing the storage data types for monitored items.
"""
enum StorageItemType {
    """Floating point number."""
    FLOAT
    """Unsigned integer."""
    INT
    """Textual data."""
    TEXT
}

############################
# Permissions
############################

"""
Represents the combined user rights (groups and roles).
"""
type UserRights {
    """List of user groups."""
    userGroups: [UserGroup!]
    """List of user roles."""
    userRoles: [UserRole!]
}

"""
Represents a Zabbix user role.
"""
type UserRole {
    """Internal Zabbix ID of the role."""
    roleid: Int!
    """Name of the role."""
    name: String
    """Type of the role."""
    type: Int
    """Whether the role is read-only."""
    readonly: Int
    """Rules assigned to the role."""
    rules: UserRoleRules
}

"""
Represents the rules assigned to a user role.
"""
type UserRoleRules {
    """UI access rules."""
    ui: [UserRoleRule!]
    """Default access for UI elements."""
    ui_default_access: Int
    """Module access rules."""
    modules:[UserRoleModule!]
    """Default access for modules."""
    modules_default_access: Int
    """Whether API access is enabled."""
    api_access: Int
    """API mode."""
    api_mode: Int
    """List of API methods allowed/denied."""
    api: [String!]
    """Action rules."""
    actions: [UserRoleRule!]
    """Default access for actions."""
    actions_default_access: Int
}

"""
Represents a single rule within a user role.
"""
type UserRoleRule {
    """Name of the rule."""
    name: String
    """Status of the rule."""
    status: Int
}

"""
Represents a module assigned to a user role.
"""
type UserRoleModule {
    """Internal Zabbix module ID."""
    moduleid: String
    """Status of the module."""
    status: Int
    """Technical ID of the module."""
    id: String
    """Relative path to the module."""
    relative_path: String
}

"""
Represents a Zabbix user group.
"""
type UserGroup {
    """Internal Zabbix ID of the user group."""
    usrgrpid: Int!
    """Name of the user group."""
    name: String!
    """Frontend access level."""
    gui_access: Int
    """Status of users in the group."""
    users_status: Int
    """Permissions for host groups."""
    hostgroup_rights: [ZabbixGroupRight!]
    """Permissions for template groups."""
    templategroup_rights: [ZabbixGroupRight!]
}

"""
Represents a specific permission right for a group.
"""
type ZabbixGroupRight {
    """ID of the group the right applies to."""
    id: Int!
    """Unique ID of the group."""
    uuid: String
    """Name of the group."""
    name: String
    """Assigned permission level."""
    permission: Permission
}
