package schedule

import (
	"context"
	"fmt"
	"strings"

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

// HumanOwner resolves a schedule owner and the active workspace role attached
// to the owner member row.
type HumanOwner struct {
	User          identity.User
	WorkspaceRole string
}

// LoadHumanOwner resolves the human account that owns a schedule definition.
func (store *Store) LoadHumanOwner(ctx context.Context, workspaceID string, ownerMemberID string) (identity.User, error) {
	owner, err := store.LoadHumanOwnerWithWorkspaceRole(ctx, workspaceID, ownerMemberID)
	if err != nil {
		return identity.User{}, err
	}
	return owner.User, nil
}

// LoadHumanOwnerWithWorkspaceRole resolves the human account and active
// workspace role for the member that owns a schedule definition.
func (store *Store) LoadHumanOwnerWithWorkspaceRole(ctx context.Context, workspaceID string, ownerMemberID string) (HumanOwner, error) {
	queryer, err := queryerFromStore(store)
	if err != nil {
		return HumanOwner{}, err
	}
	return loadHumanOwnerWithWorkspaceRole(ctx, queryer, workspaceID, ownerMemberID)
}

func loadHumanOwner(ctx context.Context, queryer coredb.QueryRower, workspaceID string, ownerMemberID string) (identity.User, error) {
	owner, err := loadHumanOwnerWithWorkspaceRole(ctx, queryer, workspaceID, ownerMemberID)
	if err != nil {
		return identity.User{}, err
	}
	return owner.User, nil
}

func loadHumanOwnerWithWorkspaceRole(ctx context.Context, queryer coredb.QueryRower, workspaceID string, ownerMemberID string) (HumanOwner, error) {
	row := queryer.QueryRow(ctx, `
SELECT u.id, COALESCE(u.email, ''), COALESCE(u.mobile, ''), u.name, u.display_name, u.avatar_url,
       u.is_admin, u.email_verified_at, u.mobile_verified_at, u.created_at, u.updated_at,
       COALESCE(m.workspace_role, '')
FROM members m
JOIN users u ON u.id = m.user_id
WHERE m.workspace_id = $1
  AND m.id = $2
  AND m.type = 'human'
  AND m.status = 'active'
LIMIT 1
`, strings.TrimSpace(workspaceID), strings.TrimSpace(ownerMemberID))
	var owner HumanOwner
	if err := row.Scan(
		&owner.User.ID,
		&owner.User.Email,
		&owner.User.Mobile,
		&owner.User.Name,
		&owner.User.DisplayName,
		&owner.User.AvatarURL,
		&owner.User.IsAdmin,
		&owner.User.EmailVerifiedAt,
		&owner.User.MobileVerifiedAt,
		&owner.User.CreatedAt,
		&owner.User.UpdatedAt,
		&owner.WorkspaceRole,
	); err != nil {
		if coredb.IsNotFound(err) {
			return HumanOwner{}, storeerr.NotFound("schedule owner member is not active")
		}
		return HumanOwner{}, fmt.Errorf("load schedule owner member: %w", err)
	}
	owner.WorkspaceRole = strings.TrimSpace(owner.WorkspaceRole)
	return owner, nil
}
