package groupmeext

import (
	"context"

	"gitea.watsonlabs.net/watsonb8/groupme-lib"
)

type Client struct {
	*groupme.Client
}

// NewClient creates a new GroupMe API Client
func NewClient() *Client {
	n := Client{
		Client: groupme.NewClient(),
	}
	return &n
}
func (c Client) IndexAllGroups(authToken string) ([]*groupme.Group, error) {
	return c.IndexGroups(context.TODO(), &groupme.GroupsQuery{
		//	Omit:    "memberships",
		PerPage: 100, //TODO: Configurable and add multipage support
	}, authToken)
}

func (c Client) IndexAllRelations(authToken string) ([]*groupme.User, error) {
	return c.IndexRelations(context.TODO(), authToken)
}

func (c Client) IndexAllChats(authToken string) ([]*groupme.Chat, error) {
	return c.IndexChats(context.TODO(), &groupme.IndexChatsQuery{
		PerPage: 100, //TODO?
	}, authToken)
}

func (c Client) LoadMessagesAfter(groupID groupme.ID, lastMessageID string, lastMessageFromMe bool, private bool, authToken string) ([]*groupme.Message, error) {
	if private {
		ans, e := c.IndexDirectMessages(context.TODO(), groupID.String(), &groupme.IndexDirectMessagesQuery{
			SinceID: groupme.ID(lastMessageID),
			//Limit:    num,
		}, authToken)
		//fmt.Println(groupID, lastMessageID, num, i.Count, e)
		if e != nil {
			return nil, e
		}

		for i, j := 0, len(ans.Messages)-1; i < j; i, j = i+1, j-1 {
			ans.Messages[i], ans.Messages[j] = ans.Messages[j], ans.Messages[i]
		}
		return ans.Messages, nil
	} else {
		i, e := c.IndexMessages(context.TODO(), groupID, &groupme.IndexMessagesQuery{
			AfterID: groupme.ID(lastMessageID),
			//20 for consistency with dms
			Limit: 20,
		}, authToken)
		//fmt.Println(groupID, lastMessageID, num, i.Count, e)
		if e != nil {
			return nil, e
		}
		return i.Messages, nil
	}
}

func (c Client) LoadMessagesBefore(groupID, lastMessageID string, private bool, authToken string) ([]*groupme.Message, error) {
	if private {
		i, e := c.IndexDirectMessages(context.TODO(), groupID, &groupme.IndexDirectMessagesQuery{
			BeforeID: groupme.ID(lastMessageID),
			//Limit:    num,
		}, authToken)
		//fmt.Println(groupID, lastMessageID, num, i.Count, e)
		if e != nil {
			return nil, e
		}
		return i.Messages, nil
	} else {
		//TODO: limit max 100
		i, e := c.IndexMessages(context.TODO(), groupme.ID(groupID), &groupme.IndexMessagesQuery{
			BeforeID: groupme.ID(lastMessageID),
			//20 for consistency with dms
			Limit: 20,
		}, authToken)
		//fmt.Println(groupID, lastMessageID, num, i.Count, e)
		if e != nil {
			return nil, e
		}
		return i.Messages, nil
	}
}

func (c *Client) RemoveFromGroup(uid, groupID groupme.ID, authToken string) error {
	group, err := c.ShowGroup(context.TODO(), groupID, authToken)
	if err != nil {
		return err
	}
	return c.RemoveMember(context.TODO(), groupID, group.GetMemberByUserID(uid).ID, authToken)
}