package postgresql

import (
	"database/sql"
	"fmt"
	"nos-comptes/internal/storage/dao"
	"nos-comptes/internal/utils"

	"github.com/lib/pq"
)

const (
	pgCodeUniqueViolation     = "23505"
	pgCodeForeingKeyViolation = "23503"
)

func HandlePgError(e *pq.Error) error {
	if e.Code == pgCodeUniqueViolation {
		return dao.NewDAOError(dao.ErrTypeDuplicate, e)
	}

	if e.Code == pgCodeForeingKeyViolation {
		return dao.NewDAOError(dao.ErrTypeForeignKeyViolation, e)
	}
	return e
}

type DatabasePostgreSQL struct {
	Session *sql.DB
}

func NewDatabasePostgreSQL(connectionURI string) *DatabasePostgreSQL {
	db, err := sql.Open("postgres", connectionURI)
	if err != nil {
		utils.GetLogger().WithError(err).Fatal("Unable to get a connection to the postgres db")
	}
	err = db.Ping()
	if err != nil {
		fmt.Println(err)
		utils.GetLogger().WithError(err).Fatal("Unable to ping the postgres db")
	}
	return &DatabasePostgreSQL{Session: db}
}
