package teamworkflow

import (
	"context"
	"database/sql"
	"errors"
	"fmt"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
	"github.com/tidbcloud/AgentTeam/internal/store/agent"
	"github.com/tidbcloud/AgentTeam/internal/store/model"
	"github.com/tidbcloud/AgentTeam/internal/store/storeerr"
)

func requireCurrentLeader(ctx context.Context, queryer coredb.Queryer, authenticated agent.AuthenticatedAgent, teamID string) (model.WorkspaceTeam, error) {
	workspaceID := strings.TrimSpace(authenticated.WorkspaceID)
	memberID := strings.TrimSpace(authenticated.MemberID)
	teamID = strings.TrimSpace(teamID)
	if workspaceID == "" || strings.TrimSpace(authenticated.AgentID) == "" || memberID == "" || teamID == "" {
		return model.WorkspaceTeam{}, storeerr.Forbidden("authenticated Team leader is required")
	}
	var team model.WorkspaceTeam
	var archivedAt sql.NullTime
	err := queryer.QueryRow(ctx, `
SELECT t.id, t.workspace_id, t.handle, t.display_name, t.description, t.avatar_url,
       t.visibility, t.status, COALESCE(t.channel_id, ''), t.created_by_member_id,
       t.created_at, t.updated_at, t.archived_at
FROM workspace_teams t
JOIN workspace_team_members leader
  ON leader.workspace_id=t.workspace_id
 AND leader.team_id=t.id
 AND leader.actor_kind='agent'
 AND leader.actor_id=$3
 AND leader.role='leader'
 AND leader.removed_at IS NULL
WHERE t.workspace_id=$1 AND t.id=$2 AND t.status='active'
FOR UPDATE
`, workspaceID, teamID, memberID).Scan(
		&team.ID, &team.WorkspaceID, &team.Handle, &team.DisplayName, &team.Description,
		&team.AvatarURL, &team.Visibility, &team.Status, &team.ChannelID,
		&team.CreatedByMemberID, &team.CreatedAt, &team.UpdatedAt, &archivedAt,
	)
	if err != nil {
		if errors.Is(err, sql.ErrNoRows) || coredb.IsNotFound(err) {
			return model.WorkspaceTeam{}, storeerr.Forbidden("only the current Team leader may manage Team Workflows")
		}
		return model.WorkspaceTeam{}, fmt.Errorf("authorize Team Workflow leader: %w", err)
	}
	if archivedAt.Valid {
		value := archivedAt.Time.UTC()
		team.ArchivedAt = &value
	}
	return team, nil
}
