package mongo

import (
	"github.com/cuigh/swirl/model"
	"github.com/globalsign/mgo"
	"github.com/globalsign/mgo/bson"
)

func (d *Dao) ChartList() (charts []*model.Chart, err error) {
	d.do(func(db *database) {
		charts = []*model.Chart{}
		err = db.C("chart").Find(nil).All(&charts)
	})
	return
}

func (d *Dao) ChartCreate(chart *model.Chart) (err error) {
	d.do(func(db *database) {
		err = db.C("chart").Insert(chart)
	})
	return
}

func (d *Dao) ChartGet(name string) (chart *model.Chart, err error) {
	d.do(func(db *database) {
		chart = &model.Chart{}
		err = db.C("chart").FindId(name).One(chart)
		if err == mgo.ErrNotFound {
			chart, err = nil, nil
		} else if err != nil {
			chart = nil
		}
	})
	return
}

func (d *Dao) ChartBatch(names ...string) (charts []*model.Chart, err error) {
	d.do(func(db *database) {
		q := bson.M{"_id": bson.M{"$in": names}}
		charts = make([]*model.Chart, 0)
		err = db.C("chart").Find(q).All(&charts)
		return
	})
	return
}

func (d *Dao) ChartUpdate(chart *model.Chart) (err error) {
	d.do(func(db *database) {
		//update := bson.M{
		//	"$set": bson.M{
		//		"name": chart.Name,
		//		"desc": chart.Description,
		//	},
		//}
		err = db.C("chart").UpdateId(chart.Name, chart)
	})
	return
}

func (d *Dao) ChartDelete(name string) (err error) {
	d.do(func(db *database) {
		err = db.C("chart").RemoveId(name)
	})
	return
}

func (d *Dao) DashboardGet(name, key string) (dashboard *model.ChartDashboard, err error) {
	d.do(func(db *database) {
		dashboard = &model.ChartDashboard{
			Name: name,
			Key:  key,
		}
		err = db.C("dashboard").FindId(dashboard.ID()).One(dashboard)
		if err == mgo.ErrNotFound {
			dashboard, err = nil, nil
		} else if err != nil {
			dashboard = nil
		}
	})
	return
}

func (d *Dao) DashboardUpdate(dashboard *model.ChartDashboard) (err error) {
	d.do(func(db *database) {
		update := bson.M{
			"$set": dashboard,
		}
		_, err = db.C("dashboard").UpsertId(dashboard.ID(), update)
	})
	return
}
