package model

import (
	"time"

	"github.com/caos/zitadel/internal/domain"
	caos_errors "github.com/caos/zitadel/internal/errors"
	"github.com/caos/zitadel/internal/eventstore/v1/models"
)

type OrgView struct {
	ID            string
	CreationDate  time.Time
	ChangeDate    time.Time
	State         OrgState
	ResourceOwner string
	Sequence      uint64

	Name string
}

type OrgSearchRequest struct {
	Offset        uint64
	Limit         uint64
	SortingColumn OrgSearchKey
	Asc           bool
	Queries       []*OrgSearchQuery
}

type OrgSearchKey int32

const (
	OrgSearchKeyUnspecified OrgSearchKey = iota
	OrgSearchKeyOrgID
	OrgSearchKeyOrgName
	OrgSearchKeyOrgDomain
	OrgSearchKeyState
	OrgSearchKeyResourceOwner
	OrgSearchKeyOrgNameIgnoreCase //used for lowercase search
)

type OrgSearchQuery struct {
	Key    OrgSearchKey
	Method domain.SearchMethod
	Value  interface{}
}

type OrgSearchResult struct {
	Offset      uint64
	Limit       uint64
	TotalResult uint64
	Result      []*OrgView
	Sequence    uint64
	Timestamp   time.Time
}

func (r *OrgSearchRequest) EnsureLimit(limit uint64) error {
	if r.Limit > limit {
		return caos_errors.ThrowInvalidArgument(nil, "SEARCH-200ds", "Errors.Limit.ExceedsDefault")
	}
	if r.Limit == 0 {
		r.Limit = limit
	}
	return nil
}

func OrgViewToOrg(o *OrgView) *Org {
	return &Org{
		ObjectRoot: models.ObjectRoot{
			AggregateID:   o.ID,
			ChangeDate:    o.ChangeDate,
			CreationDate:  o.CreationDate,
			ResourceOwner: o.ResourceOwner,
			Sequence:      o.Sequence,
		},
		Name:  o.Name,
		State: o.State,
	}
}