package tysc

import (
	"gitlab.thpeetz.de/kontor/kontor-go/pkg/dao"

	mgo "gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
)

// PositionDAO extends the type BaseDAO.
type PositionDAO struct {
	Db dao.BaseDAO
}

const (
	// POSITIONCOLLECTION defines the collection name for storing positions.
	POSITIONCOLLECTION = "position"
	// POSITIONMODEL defines the name of the position data model.
	POSITIONMODEL = "kontor.tysc.position"
)

// FindAll retrieves the list of positions from the database.
func (m *PositionDAO) FindAll() ([]Position, error) {
	m.Db.Connect()
	var positions []Position
	err := m.Db.MongoDb.C(POSITIONCOLLECTION).Find(bson.M{"model": POSITIONMODEL}).All(&positions)
	return positions, err
}

// FindByID returns a position with given id or returns the error.
func (m *PositionDAO) FindByID(id string) (Position, error) {
	m.Db.Connect()
	var position Position
	err := m.Db.MongoDb.C(POSITIONCOLLECTION).FindId(bson.ObjectIdHex(id)).One(&position)
	return position, err
}

// FindByName returns a position with given name or returns the error.
func (m *PositionDAO) FindByName(name string) (Position, error) {
	m.Db.Connect()
	var position Position
	err := m.Db.MongoDb.C(POSITIONCOLLECTION).Find(bson.M{"name": name, "model": POSITIONMODEL}).One(&position)
	return position, err
}

// Insert a position into database.
func (m *PositionDAO) Insert(position Position) error {
	m.Db.Connect()
	position.Model = POSITIONMODEL
	err := m.Db.MongoDb.C(POSITIONCOLLECTION).Insert(&position)
	return err
}

// Upsert a position into database.
func (m *PositionDAO) Upsert(position Position) (*mgo.ChangeInfo, error) {
	m.Db.Connect()
	position.Model = POSITIONMODEL
	info, err := m.Db.MongoDb.C(POSITIONCOLLECTION).Upsert(bson.M{"name": position.Name}, &position)
	return info, err
}

// Update an existing position.
func (m *PositionDAO) Update(position Position) error {
	m.Db.Connect()
	err := m.Db.MongoDb.C(POSITIONCOLLECTION).UpdateId(position.ID, &position)
	return err
}

// Delete an existing position.
func (m *PositionDAO) Delete(position Position) error {
	m.Db.Connect()
	err := m.Db.MongoDb.C(POSITIONCOLLECTION).Remove(&position)
	return err
}
