package repositories_astrologer

import (
	config "astrology-api/configs"
	models "astrology-api/models/astrologermodel"
	"errors"
	"time"

	"gorm.io/gorm"
)

type statusLogRepository struct {
	db *gorm.DB
}

func NewStatusLogRepository() StatusLogRepository {

	return &statusLogRepository{
		db: config.DB,
	}
}

func NewStatusLogRepositoryWithDB(
	db *gorm.DB,
) StatusLogRepository {

	return &statusLogRepository{
		db: db,
	}
}

func (r *statusLogRepository) CreateStatusLog(
	log *models.AstrologerStatusLog,
) error {

	if log == nil {
		return errors.New("status log cannot be nil")
	}

	now := time.Now()

	log.IsActive = true
	log.IsDelete = false
	log.CreatedAt = &now
	log.UpdatedAt = &now

	return r.db.Create(log).Error
}

func (r *statusLogRepository) GetStatusLogByID(
	id uint,
) (*models.AstrologerStatusLog, error) {

	var log models.AstrologerStatusLog

	err := r.db.
		Where("id = ?", id).
		Where("is_delete = ?", false).
		First(&log).Error

	if err != nil {
		return nil, err
	}

	return &log, nil
}

func (r *statusLogRepository) GetStatusLogs(
	astrologerID uint,
) ([]models.AstrologerStatusLog, error) {

	var logs []models.AstrologerStatusLog

	err := r.db.
		Where("astrologer_id = ?", astrologerID).
		Where("is_delete = ?", false).
		Order("created_at DESC").
		Find(&logs).Error

	if err != nil {
		return nil, err
	}

	return logs, nil
}

func (r *statusLogRepository) GetLatestStatusLog(
	astrologerID uint,
) (*models.AstrologerStatusLog, error) {

	var log models.AstrologerStatusLog

	err := r.db.
		Where("astrologer_id = ?", astrologerID).
		Where("is_delete = ?", false).
		Order("created_at DESC").
		First(&log).Error

	if err != nil {
		return nil, err
	}

	return &log, nil
}

func (r *statusLogRepository) DeleteStatusLog(
	id uint,
) error {

	now := time.Now()

	return r.db.
		Model(&models.AstrologerStatusLog{}).
		Where("id = ?", id).
		Updates(map[string]interface{}{
			"is_active":  false,
			"is_delete":  true,
			"updated_at": &now,
		}).Error
}

func (r *statusLogRepository) DeleteStatusLogsByAstrologer(
	astrologerID uint,
) error {

	now := time.Now()

	return r.db.
		Model(&models.AstrologerStatusLog{}).
		Where("astrologer_id = ?", astrologerID).
		Updates(map[string]interface{}{
			"is_active":  false,
			"is_delete":  true,
			"updated_at": &now,
		}).Error
}
