/*
 * Copyright (c) 2026 Huawei Technologies Co., Ltd.
 * openFuyao is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

// Package scanner defines the common interfaces and utilities for parsing
// scanner output (kube-bench, OpenSCAP) into unified compliance check results.
package scanner

import (
	"strings"

	compliancev1alpha1 "gitcode.com/openFuyao/compliance-operator/api/v1alpha1"
)

// Parser defines the interface that all scanner output parsers must implement.
// Each scanner engine (kube-bench, OpenSCAP) provides its own implementation
// that converts raw scanner output into a slice of UnifiedCheckResult.
type Parser interface {
	// Parse parses raw scanner output and returns unified check results.
	// The raw output is expected to contain structured data (JSON or XML)
	// optionally wrapped between ResultStartMarker and ResultEndMarker.
	Parse(rawOutput string) ([]compliancev1alpha1.UnifiedCheckResult, error)
}

// ResultMarker constants define the delimiters used to extract scanner output
// from pod logs. The result collector wraps scanner output between these
// markers to separate it from other log content.
const (
	ResultStartMarker = "===COMPLIANCE_RESULT_START==="
	ResultEndMarker   = "===COMPLIANCE_RESULT_END==="
)

// ExtractBetweenMarkers extracts content between start and end markers.
// Returns the extracted content (trimmed of leading/trailing whitespace)
// and a boolean indicating whether both markers were found in the correct order.
// If markers are not found or end appears before start, returns empty string and false.
func ExtractBetweenMarkers(content, startMarker, endMarker string) (string, bool) {
	startIdx := strings.Index(content, startMarker)
	endIdx := strings.Index(content, endMarker)

	if startIdx == -1 || endIdx == -1 || endIdx <= startIdx {
		return "", false
	}

	extracted := content[startIdx+len(startMarker):endIdx]
	return strings.TrimSpace(extracted), true
}