package repo

import (
	ent "github.com/tidbcloud/devops/entity/github"
	"github.com/tidbcloud/devops/pkg/infra/utils/repoopt"
)

var (
	PROption   prOpts
	RepoOption repoOpts
)

type prOpts struct{}

func (_ prOpts) RepoIs(l ent.RepoLocation) repoopt.Option {
	owner, repo := l.Parse()

	ownerOpt := &repoopt.Filter[string]{
		Column: "owner",
		Value:  &owner,
	}
	repoOpt := &repoopt.Filter[string]{
		Column: "repo",
		Value:  &repo,
	}

	return repoopt.Aggregate(ownerOpt, repoOpt)
}

func (_ prOpts) LocationIn(l ...ent.PRLocation) repoopt.Option {
	return &repoopt.Filter[ent.PRLocation]{
		Column: "location",
		Values: l,
	}
}

func (_ prOpts) StateIn(s ...string) repoopt.Option {
	return &repoopt.Filter[string]{
		Column: "state",
		Values: s,
	}
}

func (_ prOpts) WithPager(page, perPage int) repoopt.Option {
	pager := &repoopt.Pager{
		Page:    page,
		PerPage: perPage,
	}

	order := &repoopt.Order{
		Column: "updated_at",
		Desc:   true,
	}
	return repoopt.Aggregate(pager, order)
}

type repoOpts struct{}

func (_ repoOpts) OwnerIn(owners []string) repoopt.Option {
	ownerOpt := &repoopt.Filter[string]{
		Column: "owner",
		Values: owners,
	}
	return repoopt.Aggregate(ownerOpt)
}

func (_ repoOpts) LocationIn(l ...ent.RepoLocation) repoopt.Option {
	return &repoopt.Filter[ent.RepoLocation]{
		Column: "location",
		Values: l,
	}
}

func (_ repoOpts) LocationLike(l string) repoopt.Option {
	return &repoopt.Filter[string]{
		Column: "location",
		Like:   &l,
	}
}

func (_ repoOpts) WithPager(page, perPage int) repoopt.Option {
	pager := &repoopt.Pager{
		Page:    page,
		PerPage: perPage,
	}

	order := &repoopt.Order{
		Column: "pushed_at",
		Desc:   true,
	}
	return repoopt.Aggregate(pager, order)
}
