package models

import (
	"errors"
	"time"
)

// Typed errors
var (
	ErrTeamNotFound  = errors.New("Team not found")
	ErrTeamNameTaken = errors.New("Team name is taken")
)

// Team model
type Team struct {
	Id    int64  `json:"id"`
	OrgId int64  `json:"orgId"`
	Name  string `json:"name"`
	Email string `json:"email"`

	Created time.Time `json:"created"`
	Updated time.Time `json:"updated"`
}

// ---------------------
// COMMANDS

type CreateTeamCommand struct {
	Name  string `json:"name" binding:"Required"`
	Email string `json:"email"`
	OrgId int64  `json:"-"`

	Result Team `json:"-"`
}

type UpdateTeamCommand struct {
	Id    int64
	Name  string
	Email string
	OrgId int64 `json:"-"`
}

type DeleteTeamCommand struct {
	OrgId int64
	Id    int64
}

type GetTeamByIdQuery struct {
	OrgId  int64
	Id     int64
	Result *Team
}

type GetTeamsByUserQuery struct {
	OrgId  int64
	UserId int64   `json:"userId"`
	Result []*Team `json:"teams"`
}

type SearchTeamsQuery struct {
	Query string
	Name  string
	Limit int
	Page  int
	OrgId int64

	Result SearchTeamQueryResult
}

type SearchTeamDto struct {
	Id          int64  `json:"id"`
	OrgId       int64  `json:"orgId"`
	Name        string `json:"name"`
	Email       string `json:"email"`
	AvatarUrl   string `json:"avatarUrl"`
	MemberCount int64  `json:"memberCount"`
}

type SearchTeamQueryResult struct {
	TotalCount int64            `json:"totalCount"`
	Teams      []*SearchTeamDto `json:"teams"`
	Page       int              `json:"page"`
	PerPage    int              `json:"perPage"`
}
