package main

import "strings"

type RouteGroup struct {
	Path      string
	RouteList []*RouteImpl
	RunBefore []Runnable

	NoHead bool
}

func newRouteGroup(path string, routes ...*RouteImpl) *RouteGroup {
	g := &RouteGroup{Path: path}
	for _, route := range routes {
		route.Parent = g
		g.RouteList = append(g.RouteList, route)
	}
	return g
}

func (g *RouteGroup) Not(path ...string) *RouteSubset {
	routes := make([]*RouteImpl, len(g.RouteList))
	copy(routes, g.RouteList)
	for i, route := range routes {
		if inStringList(route.Path, path) {
			routes = append(routes[:i], routes[i+1:]...)
		}
	}
	return &RouteSubset{routes}
}

func inStringList(needle string, list []string) bool {
	for _, item := range list {
		if item == needle {
			return true
		}
	}
	return false
}

func (g *RouteGroup) NoHeader() *RouteGroup {
	g.NoHead = true
	return g
}

func (g *RouteGroup) Before(lines ...string) *RouteGroup {
	for _, line := range lines {
		g.RunBefore = append(g.RunBefore, Runnable{line, false})
	}
	return g
}

func (g *RouteGroup) LitBefore(lines ...string) *RouteGroup {
	for _, line := range lines {
		g.RunBefore = append(g.RunBefore, Runnable{line, true})
	}
	return g
}

/*func (g *RouteGroup) Routes(routes ...*RouteImpl) *RouteGroup {
	for _, route := range routes {
		route.Parent = g
		g.RouteList = append(g.RouteList, route)
	}
	return g
}*/

func (g *RouteGroup) Routes(routes ...interface{}) *RouteGroup {
	for _, route := range routes {
		switch r := route.(type) {
		case *RouteImpl:
			r.Parent = g
			g.RouteList = append(g.RouteList, r)
		case RouteSet:
			for _, rr := range r.Items {
				rr.Name = r.Name + rr.Name
				rr.Path = strings.TrimSuffix(r.Path, "/") + "/" + strings.TrimPrefix(rr.Path, "/")
				rr.Parent = g
				g.RouteList = append(g.RouteList, rr)
			}
		}
	}
	return g
}