package bootstate

import (
	"context"
	"database/sql"
	"fmt"
)

// ConnectorEventSourceLaneColumnsReady reports whether the four source-lane
// columns exist on _System_ConnectorEvent. Relocated verbatim from
// internal/bootstrap so both the bootstrap-state receipt check and the relocated
// control-plane backfill reach it through a neutral sibling. SQL is unchanged.
func ConnectorEventSourceLaneColumnsReady(ctx context.Context, db *sql.DB) (bool, error) {
	var count int
	if err := db.QueryRowContext(ctx, `
SELECT COUNT(*)
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_SCHEMA = DATABASE()
   AND TABLE_NAME = '_System_ConnectorEvent'
   AND COLUMN_NAME IN ('Payload', 'SourceObjectKind', 'SourceObjectID', 'SourceLaneKey')`).Scan(&count); err != nil {
		return false, fmt.Errorf("connectorEventSourceLaneColumnsReady: %w", err)
	}
	return count == 4, nil
}

// ConnectorEventSourceLanePayloadOnlyCount reports how many connector-event rows
// still carry envelope source-lane data only in Payload. Relocated verbatim from
// internal/bootstrap; SQL is unchanged.
func ConnectorEventSourceLanePayloadOnlyCount(ctx context.Context, db *sql.DB) (int, error) {
	var remaining int
	if err := db.QueryRowContext(ctx, `
SELECT COUNT(*)
  FROM _System_ConnectorEvent
 WHERE Payload IS NOT NULL
   AND NULLIF(JSON_UNQUOTE(JSON_EXTRACT(Payload, '$.objectKind')), '') IS NOT NULL
   AND NULLIF(JSON_UNQUOTE(JSON_EXTRACT(Payload, '$.sourceID')), '') IS NOT NULL
   AND (
        SourceObjectKind IS NULL OR SourceObjectKind = ''
        OR SourceObjectID IS NULL OR SourceObjectID = ''
        OR SourceLaneKey IS NULL OR SourceLaneKey = ''
   )`).Scan(&remaining); err != nil {
		return 0, err
	}
	return remaining, nil
}

// ConnectorEventEnqueueOrdinalBackfillColumnsReady reports whether the five
// enqueue-ordinal columns exist on _System_ConnectorEvent. Relocated verbatim
// from internal/bootstrap so both the bootstrap-state receipt check and the
// relocated control-plane backfill reach it through a neutral sibling. SQL is
// unchanged.
func ConnectorEventEnqueueOrdinalBackfillColumnsReady(ctx context.Context, db *sql.DB) (bool, error) {
	var count int
	if err := db.QueryRowContext(ctx, `
SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
  AND TABLE_NAME = '_System_ConnectorEvent'
  AND COLUMN_NAME IN ('Id', 'InstalledPackId', 'EnqueueOrdinal', 'CreatedDate', 'DeliverySequence')`).Scan(&count); err != nil {
		return false, fmt.Errorf("connectorEventEnqueueOrdinalBackfillColumnsReady: %w", err)
	}
	return count == 5, nil
}

// ConnectorEventEnqueueOrdinalLiveZeroCount reports how many live connector-event
// rows still have a zero EnqueueOrdinal. Relocated verbatim from
// internal/bootstrap; SQL is unchanged.
func ConnectorEventEnqueueOrdinalLiveZeroCount(ctx context.Context, db *sql.DB) (int, error) {
	var count int
	if err := db.QueryRowContext(ctx, `
	SELECT COUNT(*)
	FROM _System_ConnectorEvent
	WHERE EnqueueOrdinal = 0
	  AND Status NOT IN ('processed', 'dead')`).Scan(&count); err != nil {
		return 0, fmt.Errorf("connector event zero enqueue ordinal live count: %w", err)
	}
	return count, nil
}
