package models

import (
	"log"

	"github.com/sujit-baniya/fiber-boilerplate/app"
	"gorm.io/gorm"
)

type ConxSsh struct {
	gorm.Model
	Usuario    string   `json:"usuario" gorm:"column:usuario"`
	Puerto     string   `json:"puerto" gorm:"column:puerto"`
	ServidorID uint     `json:"servidor_id" gorm:"column:servidor_id;foreignKey:ServidorID"`
	Password   string   `json:"password" gorm:"column:password"`
	Servidor   Servidor `json:"servidor" gorm:"foreignKey:ServidorID"`
}

func (ConxSsh) TableName() string {
	return "conx_ssh"
}

func GetAllConxSsh(limit, offset int, search string) ([]ConxSsh, int64, error) {
	var items []ConxSsh
	var total int64
	db := app.Http.Database.DB.Model(&ConxSsh{})

	if search != "" {
		db = db.Where("usuario LIKE ? OR puerto LIKE ?", "%"+search+"%", "%"+search+"%")
	}

	db = db.Preload("Servidor")

	if err := db.Count(&total).Error; err != nil {
		log.Printf("Error counting conx ssh: %v", err)
		return nil, 0, err
	}

	if err := db.Order("id DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
		log.Printf("Error retrieving conx ssh: %v", err)
		return nil, 0, err
	}

	return items, total, nil
}

func CreateConxSsh(conxSsh ConxSsh) error {
	if err := app.Http.Database.DB.Omit("Servidor").Create(&conxSsh).Error; err != nil {
		return err
	}
	return nil
}

func UpdateConxSsh(conxSsh ConxSsh) error {
	if err := app.Http.Database.DB.Model(&conxSsh).Omit("Servidor").Updates(map[string]interface{}{
		"usuario":     conxSsh.Usuario,
		"puerto":      conxSsh.Puerto,
		"servidor_id": conxSsh.ServidorID,
		"password":    conxSsh.Password,
	}).Error; err != nil {
		return err
	}
	return nil
}

func DeleteConxSsh(conxSsh ConxSsh) error {
	if err := app.Http.Database.DB.Delete(&conxSsh).Error; err != nil {
		return err
	}
	return nil
}
