package main

import (
	"database/sql"
	"fmt"
	_ "github.com/lib/pq"
	"github.com/sirupsen/logrus"
	"time"
)

type PostgresMonitor struct {
	config ConfigComponent
}

func NewPostgresMonitor(config ConfigComponent) *PostgresMonitor {
	return &PostgresMonitor{
		config: config,
	}
}

func (m *PostgresMonitor) Config() *ConfigComponent {
	return &m.config
}

func (m *PostgresMonitor) Measure() (Datapoint, error) {
	sslMode := "verify-full"
	if m.config.Postgres.Insecure {
		sslMode = "allow"
	}
	connStr := fmt.Sprintf(
		"postgres://%s:%s@%s:%d/%s?sslmode=%s",
		m.config.Postgres.Username,
		m.config.Postgres.Password,
		m.config.Postgres.Hostname,
		m.config.Postgres.Port,
		m.config.Postgres.Database,
		sslMode,
	)
	before := time.Now()
	db, err := sql.Open("postgres", connStr)
	after := time.Now()
	latency := int(after.Sub(before).Nanoseconds() / 1000000)
	defer db.Close()
	if err != nil {
		logrus.Infof("Monitor %s: %s", err)
		return Datapoint{
			Time:    after,
			Up:      false,
			Latency: latency,
		}, nil
	}

	return Datapoint{
		Time:    after,
		Up:      true,
		Latency: latency,
	}, nil
}