// Copyright 2023 Harness, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package parser

import (
	"regexp"

	"github.com/harness/gitness/git/enum"
)

var regExpDiffExtHeader = regexp.MustCompile(
	"^(" +
		enum.DiffExtHeaderOldMode + "|" +
		enum.DiffExtHeaderNewMode + "|" +
		enum.DiffExtHeaderDeletedFileMode + "|" +
		enum.DiffExtHeaderNewFileMode + "|" +
		enum.DiffExtHeaderCopyFrom + "|" +
		enum.DiffExtHeaderCopyTo + "|" +
		enum.DiffExtHeaderRenameFrom + "|" +
		enum.DiffExtHeaderRenameTo + "|" +
		enum.DiffExtHeaderSimilarity + "|" +
		enum.DiffExtHeaderDissimilarity + "|" +
		enum.DiffExtHeaderIndex +
		") (.+)$")

// ParseDiffFileExtendedHeader parses a generic extended header line.
func ParseDiffFileExtendedHeader(line string) (string, string) {
	groups := regExpDiffExtHeader.FindStringSubmatch(line)
	if groups == nil {
		return "", ""
	}

	return groups[1], groups[2]
}

// regExpDiffFileIndexHeader parses the `index` extended header line with a format like:
//
//	index f994c2cf569523ba736473bbfbac3700fa1db28d..0000000000000000000000000000000000000000
//	index 68233d6cd204b0df84e91a1ce8c8b75e13529973..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
//
// NOTE: it's NEW_SHA..OLD_SHA.
var regExpDiffFileIndexHeader = regexp.MustCompile(`^index ([0-9a-f]{4,64})\.\.([0-9a-f]{4,64})( [0-9]+)?$`)

// DiffExtParseIndex parses the `index` extended diff header line.
func DiffExtHeaderParseIndex(line string) (newSHA string, oldSHA string, ok bool) {
	groups := regExpDiffFileIndexHeader.FindStringSubmatch(line)
	if groups == nil {
		return "", "", false
	}

	return groups[1], groups[2], true
}