package issue

import (
	gitea_sdk "code.gitea.io/sdk/gitea"
)

func userLogin(u *gitea_sdk.User) string {
	if u == nil {
		return ""
	}
	return u.UserName
}

func userLogins(users []*gitea_sdk.User) []string {
	if len(users) == 0 {
		return nil
	}
	out := make([]string, 0, len(users))
	for _, u := range users {
		if u != nil {
			out = append(out, u.UserName)
		}
	}
	return out
}

func labelNames(labels []*gitea_sdk.Label) []string {
	if len(labels) == 0 {
		return nil
	}
	out := make([]string, 0, len(labels))
	for _, l := range labels {
		if l != nil {
			out = append(out, l.Name)
		}
	}
	return out
}

func slimIssue(i *gitea_sdk.Issue) map[string]any {
	if i == nil {
		return nil
	}
	m := map[string]any{
		"number":     i.Index,
		"title":      i.Title,
		"body":       i.Body,
		"state":      i.State,
		"html_url":   i.HTMLURL,
		"user":       userLogin(i.Poster),
		"labels":     labelNames(i.Labels),
		"comments":   i.Comments,
		"created_at": i.Created,
		"updated_at": i.Updated,
		"closed_at":  i.Closed,
	}
	if len(i.Assignees) > 0 {
		m["assignees"] = userLogins(i.Assignees)
	}
	if i.Milestone != nil {
		m["milestone"] = map[string]any{
			"id":    i.Milestone.ID,
			"title": i.Milestone.Title,
		}
	}
	if i.PullRequest != nil {
		m["is_pull"] = true
	}
	return m
}

func slimIssues(issues []*gitea_sdk.Issue) []map[string]any {
	out := make([]map[string]any, 0, len(issues))
	for _, i := range issues {
		if i == nil {
			continue
		}
		m := map[string]any{
			"number":     i.Index,
			"title":      i.Title,
			"state":      i.State,
			"html_url":   i.HTMLURL,
			"user":       userLogin(i.Poster),
			"comments":   i.Comments,
			"created_at": i.Created,
			"updated_at": i.Updated,
		}
		if len(i.Labels) > 0 {
			m["labels"] = labelNames(i.Labels)
		}
		out = append(out, m)
	}
	return out
}

func slimComment(c *gitea_sdk.Comment) map[string]any {
	if c == nil {
		return nil
	}
	return map[string]any{
		"id":         c.ID,
		"body":       c.Body,
		"user":       userLogin(c.Poster),
		"html_url":   c.HTMLURL,
		"created_at": c.Created,
		"updated_at": c.Updated,
	}
}

func slimComments(comments []*gitea_sdk.Comment) []map[string]any {
	out := make([]map[string]any, 0, len(comments))
	for _, c := range comments {
		out = append(out, slimComment(c))
	}
	return out
}

func slimLabels(labels []*gitea_sdk.Label) []map[string]any {
	out := make([]map[string]any, 0, len(labels))
	for _, l := range labels {
		if l == nil {
			continue
		}
		out = append(out, map[string]any{
			"id":          l.ID,
			"name":        l.Name,
			"color":       l.Color,
			"description": l.Description,
			"exclusive":   l.Exclusive,
		})
	}
	return out
}
