package dtos

import (
	"strings"

	"github.com/grafana/grafana/pkg/components/simplejson"
	"github.com/grafana/grafana/pkg/services/accesscontrol"
	"github.com/grafana/grafana/pkg/services/datasources"
)

type DataSource struct {
	Id               int64                  `json:"id"`
	UID              string                 `json:"uid"`
	OrgId            int64                  `json:"orgId"`
	Name             string                 `json:"name"`
	Type             string                 `json:"type"`
	TypeLogoUrl      string                 `json:"typeLogoUrl"`
	Access           datasources.DsAccess   `json:"access"`
	Url              string                 `json:"url"`
	User             string                 `json:"user"`
	Database         string                 `json:"database"`
	BasicAuth        bool                   `json:"basicAuth"`
	BasicAuthUser    string                 `json:"basicAuthUser"`
	WithCredentials  bool                   `json:"withCredentials"`
	IsDefault        bool                   `json:"isDefault"`
	JsonData         *simplejson.Json       `json:"jsonData,omitempty"`
	SecureJsonFields map[string]bool        `json:"secureJsonFields"`
	Version          int                    `json:"version"`
	ReadOnly         bool                   `json:"readOnly"`
	AccessControl    accesscontrol.Metadata `json:"accessControl,omitempty"`
	// swagger:ignore
	APIVersion string `json:"apiVersion"`
}

type DataSourceListItemDTO struct {
	Id          int64                `json:"id"`
	UID         string               `json:"uid"`
	OrgId       int64                `json:"orgId"`
	Name        string               `json:"name"`
	Type        string               `json:"type"`
	TypeName    string               `json:"typeName"`
	TypeLogoUrl string               `json:"typeLogoUrl"`
	Access      datasources.DsAccess `json:"access"`
	Url         string               `json:"url"`
	User        string               `json:"user"`
	Database    string               `json:"database"`
	BasicAuth   bool                 `json:"basicAuth"`
	IsDefault   bool                 `json:"isDefault"`
	JsonData    *simplejson.Json     `json:"jsonData,omitempty"`
	ReadOnly    bool                 `json:"readOnly"`
}

type DataSourceList []DataSourceListItemDTO

func (slice DataSourceList) Len() int {
	return len(slice)
}

func (slice DataSourceList) Less(i, j int) bool {
	return strings.ToLower(slice[i].Name) < strings.ToLower(slice[j].Name)
}

func (slice DataSourceList) Swap(i, j int) {
	slice[i], slice[j] = slice[j], slice[i]
}
