package models

import (
	"fmt"

	"forge.grandlyon.com/web-et-numerique/llle_project/backoffice-server/internal/common"
	"gorm.io/driver/mysql"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

type DataHandler struct {
	db *gorm.DB
}

var (
	dbUser     = common.StringValueFromEnv("DATABASE_USER", "")
	dbPassword = common.StringValueFromEnv("DATABASE_PASSWORD", "")
	dbName     = common.StringValueFromEnv("DATABASE_NAME", "")
	dbHost     = common.StringValueFromEnv("DATABASE_HOST", "")
)

// NewDataHandler init a DataHandler and returns a pointer to it
func NewDataHandler() *DataHandler {
	var db *gorm.DB
	var err error
	if dbUser == "" || dbPassword == "" || dbName == "" {
		db, err = gorm.Open(sqlite.Open("backoffice.db"), &gorm.Config{})
		if err != nil {
			panic("failed to connect database")
		}
	} else {
		dsn := fmt.Sprintf("%v:%v@tcp(%v:3306)/%v?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbName)
		db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
		if err != nil {
			panic("failed to connect database")
		}
	}

	// Migrate the schema
	db.AutoMigrate(&MonthlyInfo{})
	db.AutoMigrate(&MonthlyNews{})
	db.AutoMigrate(&Poll{})
	db.AutoMigrate(&PartnersInfo{})

	// Create default partner status
	db.Create(&PartnersInfo{
		GRDFFailure:           false,
		EnedisFailure:         false,
		EGLFailure:            false,
		NotificationActivated: false,
	})

	return &DataHandler{db: db}
}