// Copyright 2025 The Ebitengine Authors
//
// 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 textinput

import (
	"io"
)

func ConvertUTF16CountToByteCount(text string, c int) int {
	return convertUTF16CountToByteCount(text, c)
}

func ConvertByteCountToUTF16Count(text string, c int) int {
	return convertByteCountToUTF16Count(text, c)
}

type PieceTable = pieceTable

func (p *PieceTable) Reset(text string) {
	p.reset(text)
}

func (p *PieceTable) ReadFrom(r io.Reader) (int64, error) {
	return p.readFrom(r)
}

func (p *PieceTable) Replace(text string, start, end int) {
	p.replace(text, start, end)
}

func (p *PieceTable) WriteToWithInsertion(w io.Writer, text string, start, end int) (int64, error) {
	return p.writeToWithInsertion(w, text, start, end)
}

func (p *PieceTable) WriteRangeTo(w io.Writer, start, end int) (int64, error) {
	return p.writeRangeTo(w, start, end)
}

func (p *PieceTable) WriteRangeToWithInsertion(w io.Writer, text string, insertStart, insertEnd, rangeStart, rangeEnd int) (int64, error) {
	return p.writeRangeToWithInsertion(w, text, insertStart, insertEnd, rangeStart, rangeEnd)
}

func (p *PieceTable) FindLineBounds(selStart, selEnd int) (int, int) {
	return p.findLineBounds(selStart, selEnd)
}

func (f *Field) SetCompositionStateForTest(text string, compStart, compEnd int) {
	f.setState(textInputState{
		Text:                             text,
		CompositionSelectionStartInBytes: compStart,
		CompositionSelectionEndInBytes:   compEnd,
	})
}

func (p *PieceTable) Undo() (int, int, bool) {
	return p.undo()
}

func (p *PieceTable) Redo() (int, int, bool) {
	return p.redo()
}

func (p *PieceTable) UpdateByIME(text string, replacementStart, replacementEnd, start, end int) int {
	return p.updateByIME(text, replacementStart, replacementEnd, start, end)
}
