package models

import (
	"crypto/rand"
	"fmt"

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

// TelegramStaffToken almacena un código de verificación temporal para que un
// usuario interno (staff) vincule su Telegram y reciba notificaciones personales
// (ej: tareas asignadas), igual que TelegramPortalToken pero para Users.
type TelegramStaffToken struct {
	gorm.Model
	UserID uint   `json:"user_id" gorm:"column:user_id;uniqueIndex"`
	Token  string `json:"token"   gorm:"column:token;uniqueIndex;size:8"`
}

func (TelegramStaffToken) TableName() string { return "telegram_staff_tokens" }

// GenerateTelegramStaffToken genera (o renueva) el código de vinculación para el usuario.
func GenerateTelegramStaffToken(userID uint) (*TelegramStaffToken, error) {
	app.Http.Database.DB.Unscoped().Where("user_id = ?", userID).Delete(&TelegramStaffToken{})

	b := make([]byte, 3)
	if _, err := rand.Read(b); err != nil {
		return nil, fmt.Errorf("no se pudo generar token: %w", err)
	}
	token := fmt.Sprintf("%06X", b)

	t := &TelegramStaffToken{UserID: userID, Token: token}
	if err := app.Http.Database.DB.Create(t).Error; err != nil {
		return nil, err
	}
	return t, nil
}

// GetTelegramStaffTokenByUser devuelve el token vigente de un usuario interno.
func GetTelegramStaffTokenByUser(userID uint) (*TelegramStaffToken, error) {
	var t TelegramStaffToken
	err := app.Http.Database.DB.Where("user_id = ?", userID).First(&t).Error
	if err != nil {
		return nil, err
	}
	return &t, nil
}

// DeleteTelegramStaffToken elimina el token de un usuario (tras vincular correctamente).
func DeleteTelegramStaffToken(userID uint) {
	app.Http.Database.DB.Unscoped().Where("user_id = ?", userID).Delete(&TelegramStaffToken{})
}

// UpdateUserTelegramChatID vincula el chat_id de Telegram al usuario interno.
func UpdateUserTelegramChatID(userID uint, chatID string) error {
	return app.Http.Database.DB.Model(&Users{}).Where("id = ?", userID).
		Update("telegram_chat_id", chatID).Error
}
