// Code generated by sqlc. DO NOT EDIT.
// source: team.sql

package db

import (
	"context"
	"time"

	"github.com/google/uuid"
)

const createTeam = `-- name: CreateTeam :one
INSERT INTO team (organization_id, created_at, name) VALUES ($1, $2, $3) RETURNING team_id, created_at, name, organization_id
`

type CreateTeamParams struct {
	OrganizationID uuid.UUID `json:"organization_id"`
	CreatedAt      time.Time `json:"created_at"`
	Name           string    `json:"name"`
}

func (q *Queries) CreateTeam(ctx context.Context, arg CreateTeamParams) (Team, error) {
	row := q.db.QueryRowContext(ctx, createTeam, arg.OrganizationID, arg.CreatedAt, arg.Name)
	var i Team
	err := row.Scan(
		&i.TeamID,
		&i.CreatedAt,
		&i.Name,
		&i.OrganizationID,
	)
	return i, err
}

const deleteTeamByID = `-- name: DeleteTeamByID :exec
DELETE FROM team WHERE team_id = $1
`

func (q *Queries) DeleteTeamByID(ctx context.Context, teamID uuid.UUID) error {
	_, err := q.db.ExecContext(ctx, deleteTeamByID, teamID)
	return err
}

const getAllTeams = `-- name: GetAllTeams :many
SELECT team_id, created_at, name, organization_id FROM team
`

func (q *Queries) GetAllTeams(ctx context.Context) ([]Team, error) {
	rows, err := q.db.QueryContext(ctx, getAllTeams)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []Team
	for rows.Next() {
		var i Team
		if err := rows.Scan(
			&i.TeamID,
			&i.CreatedAt,
			&i.Name,
			&i.OrganizationID,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const getMemberTeamIDsForUserID = `-- name: GetMemberTeamIDsForUserID :many
SELECT team_id FROM team_member WHERE user_id = $1
`

func (q *Queries) GetMemberTeamIDsForUserID(ctx context.Context, userID uuid.UUID) ([]uuid.UUID, error) {
	rows, err := q.db.QueryContext(ctx, getMemberTeamIDsForUserID, userID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []uuid.UUID
	for rows.Next() {
		var team_id uuid.UUID
		if err := rows.Scan(&team_id); err != nil {
			return nil, err
		}
		items = append(items, team_id)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const getTeamByID = `-- name: GetTeamByID :one
SELECT team_id, created_at, name, organization_id FROM team WHERE team_id = $1
`

func (q *Queries) GetTeamByID(ctx context.Context, teamID uuid.UUID) (Team, error) {
	row := q.db.QueryRowContext(ctx, getTeamByID, teamID)
	var i Team
	err := row.Scan(
		&i.TeamID,
		&i.CreatedAt,
		&i.Name,
		&i.OrganizationID,
	)
	return i, err
}

const getTeamRoleForUserID = `-- name: GetTeamRoleForUserID :one
SELECT team_id, role_code FROM team_member WHERE user_id = $1 AND team_id = $2
`

type GetTeamRoleForUserIDParams struct {
	UserID uuid.UUID `json:"user_id"`
	TeamID uuid.UUID `json:"team_id"`
}

type GetTeamRoleForUserIDRow struct {
	TeamID   uuid.UUID `json:"team_id"`
	RoleCode string    `json:"role_code"`
}

func (q *Queries) GetTeamRoleForUserID(ctx context.Context, arg GetTeamRoleForUserIDParams) (GetTeamRoleForUserIDRow, error) {
	row := q.db.QueryRowContext(ctx, getTeamRoleForUserID, arg.UserID, arg.TeamID)
	var i GetTeamRoleForUserIDRow
	err := row.Scan(&i.TeamID, &i.RoleCode)
	return i, err
}

const getTeamRolesForUserID = `-- name: GetTeamRolesForUserID :many
SELECT team_id, role_code FROM team_member WHERE user_id = $1
`

type GetTeamRolesForUserIDRow struct {
	TeamID   uuid.UUID `json:"team_id"`
	RoleCode string    `json:"role_code"`
}

func (q *Queries) GetTeamRolesForUserID(ctx context.Context, userID uuid.UUID) ([]GetTeamRolesForUserIDRow, error) {
	rows, err := q.db.QueryContext(ctx, getTeamRolesForUserID, userID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []GetTeamRolesForUserIDRow
	for rows.Next() {
		var i GetTeamRolesForUserIDRow
		if err := rows.Scan(&i.TeamID, &i.RoleCode); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const getTeamsForOrganization = `-- name: GetTeamsForOrganization :many
SELECT team_id, created_at, name, organization_id FROM team WHERE organization_id = $1
`

func (q *Queries) GetTeamsForOrganization(ctx context.Context, organizationID uuid.UUID) ([]Team, error) {
	rows, err := q.db.QueryContext(ctx, getTeamsForOrganization, organizationID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []Team
	for rows.Next() {
		var i Team
		if err := rows.Scan(
			&i.TeamID,
			&i.CreatedAt,
			&i.Name,
			&i.OrganizationID,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const getTeamsForUserIDWhereAdmin = `-- name: GetTeamsForUserIDWhereAdmin :many
SELECT team.team_id, team.created_at, team.name, team.organization_id FROM team_member INNER JOIN team
  ON team.team_id = team_member.team_id  WHERE (role_code = 'admin' OR role_code = 'member') AND user_id = $1
`

func (q *Queries) GetTeamsForUserIDWhereAdmin(ctx context.Context, userID uuid.UUID) ([]Team, error) {
	rows, err := q.db.QueryContext(ctx, getTeamsForUserIDWhereAdmin, userID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []Team
	for rows.Next() {
		var i Team
		if err := rows.Scan(
			&i.TeamID,
			&i.CreatedAt,
			&i.Name,
			&i.OrganizationID,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}
