package helper

import (
	"errors"
	"io/ioutil"
	"sort"
	"strconv"
	"strings"
)

func GetInput(filename string) ([]string, error) {
	content, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	lines := strings.Split(string(content), "\n")
	return lines, err
}

func GetFile(filename string) (string, error) {
	content, err := ioutil.ReadFile(filename)
	if err != nil {
		return "", err
	}
	return string(content), err
}

func MapToNumber(strings []string) ([]int, error) {
	var numbers []int
	for _, line := range strings {
		number, err := strconv.Atoi(line)
		if err != nil {
			return numbers, err
		}
		numbers = append(numbers, number)
	}
	return numbers, nil
}

func FindAddendsForSum(possibleAddends []int, sum int) (int, int, error) {
	var array = make([]int, len(possibleAddends))
	copy(array, possibleAddends)
	sort.Ints(array)
	p1 := 0
	p2 := len(array) - 1
	for p1 < p2 {
		if array[p1]+array[p2] < sum {
			p1++
		}
		if array[p1]+array[p2] > sum {
			p2--
		}
		if array[p1]+array[p2] == sum {
			return array[p1], array[p2], nil
		}
	}
	return 0, 0, errors.New("No fitting Addends found")
}

func SliceIndex(limit int, predicate func(i int) bool) int {
	for i := 0; i < limit; i++ {
		if predicate(i) {
			return i
		}
	}
	return -1
}

func DeleteAt(a []int, i int, ) []int {
	return append(a[:i], a[i+1:]...)
}

func Equal(a, b []int) bool {
	if len(a) != len(b) {
		return false
	}
	for i, v := range a {
		if v != b[i] {
			return false
		}
	}
	return true
}

func Contains(elem int, array []int) bool{
	for _, val := range array{
		if val == elem{
			return true
		}
	}
	return false
}
