package transformer

import (
	"sort"
	"strings"

	"github.com/pingcap/dbaas/billing2/db/entity"
	"github.com/pingcap/dbaas/billing2/forms"
	"gorm.io/gorm"
)

func UnitFilterSlimFromEntity(ent *entity.UnitFilter) (ret *forms.UnitFilterSlim) {
	return &forms.UnitFilterSlim{
		FilterID:    ent.ID,
		TypeID:      ent.ID,
		Name:        ent.Name,
		Description: ent.Description,
		ParentID:    ent.ParentID,
		Internal:    ent.Internal,
		Priority:    ent.Priority,
	}
}

func UnitFilterFromEntity(ent *entity.UnitFilter) (ret *forms.UnitFilter) {
	return &forms.UnitFilter{
		UnitFilterSlim: *UnitFilterSlimFromEntity(ent),
		General:        ent.General,
		Category:       ent.Category,
		Provider:       ent.Provider,
		Region:         ent.Region,
		Labels:         ent.Labels,
		UnitKeyPattern: ent.UnitKeyPattern,
	}
}

func UnitFiltersToUnitFilterSlimArray(unitFilters []*forms.UnitFilter) (ret []*forms.UnitFilterSlim) {
	ret = make([]*forms.UnitFilterSlim, len(unitFilters))
	for i, uf := range unitFilters {
		ret[i] = &uf.UnitFilterSlim
	}
	return
}

func UnitFiltersSlimFromEntities(entList []*entity.UnitFilter) (ret []*forms.UnitFilterSlim) {
	ret = make([]*forms.UnitFilterSlim, len(entList))
	for i, ent := range entList {
		ret[i] = UnitFilterSlimFromEntity(ent)
	}
	return
}

func UnitFiltersFromEntities(entList []*entity.UnitFilter) (ret []*forms.UnitFilter) {
	ret = make([]*forms.UnitFilter, len(entList))
	for i, ent := range entList {
		ret[i] = UnitFilterFromEntity(ent)
	}
	return
}

func UnitFiltersEntitiesFromUnitFilterSlimForm(unitFilters []*forms.UnitFilterSlim) (ret []*entity.UnitFilter) {
	ret = make([]*entity.UnitFilter, len(unitFilters))
	for i, uf := range unitFilters {
		ret[i] = &entity.UnitFilter{Model: gorm.Model{ID: uf.FilterID}}
	}
	return
}

func UnitFiltersEntitiesFromUnitFilterForm(unitFilters []*forms.UnitFilter) (ret []*entity.UnitFilter) {
	ret = make([]*entity.UnitFilter, len(unitFilters))
	for i, uf := range unitFilters {
		ret[i] = &entity.UnitFilter{Model: gorm.Model{ID: uf.FilterID}}
	}
	return
}

func JoinUnitFilterNames(unitFilters []*entity.UnitFilter, sep string) (ret string) {
	names := make([]string, len(unitFilters))
	for i, uf := range unitFilters {
		names[i] = uf.Name
	}
	return strings.Join(names, sep)
}

func OrderedUnitFilter(unitFilters []*entity.UnitFilter) (ret []*entity.UnitFilter) {
	ret = make([]*entity.UnitFilter, len(unitFilters))
	copy(ret, unitFilters)
	sort.Slice(ret, func(i, j int) bool {
		return ret[i].Priority > ret[j].Priority
	})
	return
}
