package components

type Block struct {
	Line       int
	Comment    string
	Directives []IDirective
}

func (b *Block) GetDirectives() []IDirective {
	return b.Directives
}

func (b *Block) GetComment() string {
	return b.Comment
}

func (b *Block) GetLine() int {
	return b.Line
}

func (b *Block) FindDirectives(directiveName string) []IDirective {
	directives := make([]IDirective, 0)
	for _, directive := range b.GetDirectives() {
		if directive.GetName() == directiveName {
			directives = append(directives, directive)
		}
		if directive.GetBlock() != nil {
			directives = append(directives, directive.GetBlock().FindDirectives(directiveName)...)
		}
	}

	return directives
}

func (b *Block) UpdateDirective(key string, params []string) {
	if key == "" || len(params) == 0 {
		return
	}
	directives := b.GetDirectives()
	index := -1
	for i, dir := range directives {
		if dir.GetName() == key {
			if IsRepeatKey(key) {
				oldParams := dir.GetParameters()
				if !(len(oldParams) > 0 && oldParams[0] == params[0]) {
					continue
				}
			}
			index = i
			break
		}
	}
	newDirective := &Directive{
		Name:       key,
		Parameters: params,
	}
	if index > -1 {
		directives[index] = newDirective
	} else {
		directives = append(directives, newDirective)
	}
	b.Directives = directives
}

//func (b *Block) UpdateDirectiveBySecondKey(name string, key string, directive Directive) {
//
//	directives := b.GetDirectives()
//
//	index := -1
//	for i, dir := range directives {
//		if dir.GetName() == name && dir.GetParameters()[0] == key {
//			index = i
//			break
//		}
//	}
//	if index > -1 {
//		directives[index] = &directive
//	} else {
//		directives = append(directives, &directive)
//	}
//	b.Directives = directives
//}

//func (b *Block) RemoveDirectives(names []string) {
//	nameMaps := make(map[string]struct{}, len(names))
//	for _, name := range names {
//		nameMaps[name] = struct{}{}
//	}
//	directives := b.GetDirectives()
//	var newDirectives []IDirective
//	for _, dir := range directives {
//		if _, ok := nameMaps[dir.GetName()]; ok {
//			continue
//		}
//		newDirectives = append(newDirectives, dir)
//	}
//	b.Directives = newDirectives
//}

func (b *Block) RemoveDirective(key string, params []string) {
	directives := b.GetDirectives()
	var newDirectives []IDirective
	for _, dir := range directives {
		if dir.GetName() == key {
			if IsRepeatKey(key) && len(params) > 0 {
				oldParams := dir.GetParameters()
				if oldParams[0] == params[0] {
					continue
				}
			} else {
				continue
			}
		}
		newDirectives = append(newDirectives, dir)
	}
	b.Directives = newDirectives
}