package rui

// ListAdapter - the list data source
type ListAdapter interface {
	ListSize() int
	ListItem(index int, session Session) View
	IsListItemEnabled(index int) bool
}

type textListAdapter struct {
	items  []string
	views  []View
	params Params
}

type viewListAdapter struct {
	items []View
}

// NewTextListAdapter create the new ListAdapter for a string list displaying. The second argument is parameters of a TextView item
func NewTextListAdapter(items []string, params Params) ListAdapter {
	if items == nil {
		return nil
	}
	adapter := new(textListAdapter)
	adapter.items = items
	if params != nil {
		adapter.params = params
	} else {
		adapter.params = Params{}
	}
	adapter.views = make([]View, len(items))
	return adapter
}

// NewTextListAdapter create the new ListAdapter for a view list displaying
func NewViewListAdapter(items []View) ListAdapter {
	if items != nil {
		adapter := new(viewListAdapter)
		adapter.items = items
		return adapter
	}
	return nil
}

func (adapter *textListAdapter) ListSize() int {
	return len(adapter.items)
}

func (adapter *textListAdapter) ListItem(index int, session Session) View {
	if index < 0 || index >= len(adapter.items) {
		return nil
	}

	if adapter.views[index] == nil {
		adapter.params[Text] = adapter.items[index]
		adapter.views[index] = NewTextView(session, adapter.params)
	}

	return adapter.views[index]
}

func (adapter *textListAdapter) IsListItemEnabled(index int) bool {
	return true
}

func (adapter *viewListAdapter) ListSize() int {
	return len(adapter.items)
}

func (adapter *viewListAdapter) ListItem(index int, session Session) View {
	if index >= 0 && index < len(adapter.items) {
		return adapter.items[index]
	}
	return nil
}

func (adapter *viewListAdapter) IsListItemEnabled(index int) bool {
	if index >= 0 && index < len(adapter.items) {
		return !IsDisabled(adapter.items[index], "")
	}
	return true
}