package gitter

import "time"

// A Room in Gitter can represent a GitHub Organization, a GitHub Repository, a Gitter Channel or a One-to-one conversation.
// In the case of the Organizations and Repositories, the access control policies are inherited from GitHub.
type Room struct {

	// Room ID
	ID string `json:"id"`

	// Room name
	Name string `json:"name"`

	// Room topic. (default: GitHub repo description)
	Topic string `json:"topic"`

	// Room URI on Gitter
	URI string `json:"uri"`

	// Indicates if the room is a one-to-one chat
	OneToOne bool `json:"oneToOne"`

	// Count of users in the room
	UserCount int `json:"userCount"`

	// Number of unread messages for the current user
	UnreadItems int `json:"unreadItems"`

	// Number of unread mentions for the current user
	Mentions int `json:"mentions"`

	// Last time the current user accessed the room in ISO format
	LastAccessTime time.Time `json:"lastAccessTime"`

	// Indicates if the current user has disabled notifications
	Lurk bool `json:"lurk"`

	// Path to the room on gitter
	URL string `json:"url"`

	// Type of the room
	// - ORG: A room that represents a GitHub Organization.
	// - REPO: A room that represents a GitHub Repository.
	// - ONETOONE: A one-to-one chat.
	// - ORG_CHANNEL: A Gitter channel nested under a GitHub Organization.
	// - REPO_CHANNEL A Gitter channel nested under a GitHub Repository.
	// - USER_CHANNEL A Gitter channel nested under a GitHub User.
	GithubType string `json:"githubType"`

	// Tags that define the room
	Tags []string `json:"tags"`

	RoomMember bool `json:"roomMember"`

	// Room version.
	Version int `json:"v"`
}

type User struct {

	// Gitter User ID
	ID string `json:"id"`

	// Gitter/GitHub username
	Username string `json:"username"`

	// Gitter/GitHub user real name
	DisplayName string `json:"displayName"`

	// Path to the user on Gitter
	URL string `json:"url"`

	// User avatar URI (small)
	AvatarURLSmall string `json:"avatarUrlSmall"`

	// User avatar URI (medium)
	AvatarURLMedium string `json:"avatarUrlMedium"`
}

type Message struct {

	// ID of the message
	ID string `json:"id"`

	// Original message in plain-text/markdown
	Text string `json:"text"`

	// HTML formatted message
	HTML string `json:"html"`

	// ISO formatted date of the message
	Sent time.Time `json:"sent"`

	// ISO formatted date of the message if edited
	EditedAt time.Time `json:"editedAt"`

	// User that sent the message
	From User `json:"fromUser"`

	// Boolean that indicates if the current user has read the message.
	Unread bool `json:"unread"`

	// Number of users that have read the message
	ReadBy int `json:"readBy"`

	// List of URLs present in the message
	Urls []URL `json:"urls"`

	// List of @Mentions in the message
	Mentions []Mention `json:"mentions"`

	// List of #Issues referenced in the message
	Issues []Issue `json:"issues"`

	// Version
	Version int `json:"v"`
}

// Mention holds data about mentioned user in the message
type Mention struct {

	// User's username
	ScreenName string `json:"screenName"`

	// Gitter User ID
	UserID string `json:"userID"`
}

// Issue references issue in the message
type Issue struct {

	// Issue number
	Number string `json:"number"`
}

// URL presented in the message
type URL struct {

	// URL
	URL string `json:"url"`
}