package lrc

import "github.com/klauspost/reedsolomon"

type LRC struct {
	n      int   // 总块数，包括局部块
	k      int   // 数据块数量
	groups []int // 分组校验块生成时使用的数据块
	l      *reedsolomon.LRC
}

func New(n int, k int, groups []int) (*LRC, error) {
	lrc := &LRC{
		n:      n,
		k:      k,
		groups: groups,
	}

	l, err := reedsolomon.NewLRC(k, n-len(groups)-k, groups)
	if err != nil {
		return nil, err
	}

	lrc.l = l
	return lrc, nil
}

// 根据全局修复的原理，生成根据输入修复指定块的矩阵。要求input内元素的值<n-len(r)，且至少包含k个。
func (l *LRC) GenerateMatrix(inputIdxs []int, outputIdxs []int) ([][]byte, error) {
	return l.l.GenerateMatrix(inputIdxs, outputIdxs)
}

// 生成修复组内某个块的矩阵。只支持组内缺少一个块的情况，且默认组内的其他块都存在。
func (l *LRC) GenerateGroupMatrix(outputIdx int) ([][]byte, error) {
	return l.l.GenerateGroupMatrix(outputIdx)
}
