package models

import (
	"time"

	"github.com/grafana/grafana/pkg/components/securedata"
	"github.com/grafana/grafana/pkg/components/simplejson"
)

// DashboardSnapshot model
type DashboardSnapshot struct {
	Id                int64
	Name              string
	Key               string
	DeleteKey         string
	OrgId             int64
	UserId            int64
	External          bool
	ExternalUrl       string
	ExternalDeleteUrl string

	Expires time.Time
	Created time.Time
	Updated time.Time

	Dashboard          *simplejson.Json
	DashboardEncrypted securedata.SecureData
}

func (ds *DashboardSnapshot) DashboardJSON() (*simplejson.Json, error) {
	if ds.DashboardEncrypted != nil {
		decrypted, err := ds.DashboardEncrypted.Decrypt()
		if err != nil {
			return nil, err
		}
		return simplejson.NewJson(decrypted)
	}
	return ds.Dashboard, nil
}

// DashboardSnapshotDTO without dashboard map
type DashboardSnapshotDTO struct {
	Id          int64  `json:"id"`
	Name        string `json:"name"`
	Key         string `json:"key"`
	OrgId       int64  `json:"orgId"`
	UserId      int64  `json:"userId"`
	External    bool   `json:"external"`
	ExternalUrl string `json:"externalUrl"`

	Expires time.Time `json:"expires"`
	Created time.Time `json:"created"`
	Updated time.Time `json:"updated"`
}

// -----------------
// COMMANDS

type CreateDashboardSnapshotCommand struct {
	Dashboard *simplejson.Json `json:"dashboard" binding:"Required"`
	Name      string           `json:"name"`
	Expires   int64            `json:"expires"`

	// these are passed when storing an external snapshot ref
	External          bool   `json:"external"`
	ExternalUrl       string `json:"-"`
	ExternalDeleteUrl string `json:"-"`

	Key       string `json:"key"`
	DeleteKey string `json:"deleteKey"`

	OrgId  int64 `json:"-"`
	UserId int64 `json:"-"`

	Result *DashboardSnapshot
}

type DeleteDashboardSnapshotCommand struct {
	DeleteKey string `json:"-"`
}

type DeleteExpiredSnapshotsCommand struct {
	DeletedRows int64
}

type GetDashboardSnapshotQuery struct {
	Key       string
	DeleteKey string

	Result *DashboardSnapshot
}

type DashboardSnapshotsList []*DashboardSnapshotDTO

type GetDashboardSnapshotsQuery struct {
	Name         string
	Limit        int
	OrgId        int64
	SignedInUser *SignedInUser

	Result DashboardSnapshotsList
}
