package repository

import (
	"context"
	"lune/talentscale/internal/domain"
	"time"

	"github.com/jackc/pgx/v5/pgxpool"
)

type postgresWebhookRepository struct {
	db *pgxpool.Pool
}

func NewPostgresWebhookRepository(db *pgxpool.Pool) domain.WebhookRepository {
	return &postgresWebhookRepository{db: db}
}

func (r *postgresWebhookRepository) Create(ctx context.Context, log *domain.WebhookLog) error {
	query := `INSERT INTO webhook_logs (source, event_type, payload, headers, created_at)
	          VALUES ($1, $2, $3, $4, $5)`
	_, err := r.db.Exec(ctx, query, log.Source, log.EventType, log.Payload, log.Headers, time.Now())
	return err
}

func (r *postgresWebhookRepository) GetUnprocessed(ctx context.Context) ([]domain.WebhookLog, error) {
	query := `SELECT id, source, event_type, payload, headers, is_processed, processed_at, created_at
	          FROM webhook_logs WHERE is_processed = FALSE`
	rows, err := r.db.Query(ctx, query)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	var logs []domain.WebhookLog
	for rows.Next() {
		var log domain.WebhookLog
		if err := rows.Scan(&log.ID, &log.Source, &log.EventType, &log.Payload, &log.Headers, &log.IsProcessed, &log.ProcessedAt, &log.CreatedAt); err != nil {
			return nil, err
		}
		logs = append(logs, log)
	}
	return logs, nil
}

func (r *postgresWebhookRepository) MarkAsProcessed(ctx context.Context, id int64) error {
	query := `UPDATE webhook_logs SET is_processed = TRUE, processed_at = $1 WHERE id = $2`
	_, err := r.db.Exec(ctx, query, time.Now(), id)
	return err
}
