package models

import (
	"errors"
	"fmt"
	"time"

	"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 {
	sqlClient *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 {
	// SQL setup
	var sqlClient *gorm.DB
	var err error
	if dbUser == "" || dbPassword == "" || dbName == "" {
		sqlClient, err = gorm.Open(sqlite.Open("backoffice.db"), &gorm.Config{})
		if err != nil {
			panic("failed to connect sqlite database")
		}
	} else {
		dsn := fmt.Sprintf("%v:%v@tcp(%v:3306)/%v?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbName)
		sqlClient, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
		if err != nil {
			panic("failed to connect MySQL database")
		}
	}

	// Migrate the schema
	sqlClient.AutoMigrate(&MailSubject{})
	sqlClient.AutoMigrate(&MonthlyInfo{})
	sqlClient.AutoMigrate(&MonthlyNews{})
	sqlClient.AutoMigrate(&Poll{})
	sqlClient.AutoMigrate(&PartnersInfo{})
	sqlClient.AutoMigrate(&CustomPopup{})
	sqlClient.AutoMigrate(&Price{})
	sqlClient.AutoMigrate(&Consent{})

	// Check if partners info already exists
	var partnersInfo PartnersInfo
	err = sqlClient.First(&partnersInfo).Error
	if errors.Is(err, gorm.ErrRecordNotFound) {
		// Create default partner status
		sqlClient.Create(&PartnersInfo{
			GRDFFailure:           false,
			EnedisFailure:         false,
			EGLFailure:            false,
			NotificationActivated: false,
		})
	}

	// Check if custom popup already exists
	var customPopup CustomPopup
	err = sqlClient.First(&customPopup).Error
	if errors.Is(err, gorm.ErrRecordNotFound) {
		// Create default custom popup
		sqlClient.Create(&CustomPopup{
			PopupEnabled: false,
			Title:        "",
			Description:  "",
			EndDate:      time.Now(),
		})
	}

	return &DataHandler{sqlClient: sqlClient}
}