package storage

import (
	"context"
	"git.sch9.ru/new_gate/ms-tester/internal/models"
	"github.com/jmoiron/sqlx"
	"go.uber.org/zap"
)

type ParticipantStorage struct {
	db     *sqlx.DB
	logger *zap.Logger
}

func NewParticipantStorage(db *sqlx.DB, logger *zap.Logger) *ParticipantStorage {
	return &ParticipantStorage{
		db:     db,
		logger: logger,
	}
}

func (storage *ParticipantStorage) CreateParticipant(ctx context.Context, participant *models.Participant) (int32, error) {
	query := storage.db.Rebind(`
INSERT INTO participants
    (user_id,contest_id,name)
VALUES (?,?,?)
RETURNING id
`)

	rows, err := storage.db.QueryxContext(
		ctx,
		query,
		participant.UserId,
		participant.ContestId,
		participant.Name,
	)
	if err != nil {
		return 0, handlePgErr(err)
	}

	defer rows.Close()
	var id int32
	err = rows.StructScan(&id)
	if err != nil {
		return 0, handlePgErr(err)
	}

	return id, nil

}

func (storage *ParticipantStorage) ReadParticipantById(ctx context.Context, id int32) (*models.Participant, error) {
	var participant models.Participant
	query := storage.db.Rebind("SELECT * from participants WHERE id=? LIMIT 1")
	err := storage.db.GetContext(ctx, &participant, query, id)
	if err != nil {
		return nil, handlePgErr(err)
	}
	return &participant, nil
}

func (storage *ParticipantStorage) UpdateParticipant(ctx context.Context, id int32, participant models.Participant) error {
	query := storage.db.Rebind("UPDATE participants SET name=?")
	_, err := storage.db.ExecContext(ctx, query, participant.Name)
	if err != nil {
		return handlePgErr(err)
	}
	return nil
}

func (storage *ParticipantStorage) DeleteParticipant(ctx context.Context, id int32) error {
	query := storage.db.Rebind("DELETE FROM participants WHERE id=?")
	_, err := storage.db.ExecContext(ctx, query, id)
	if err != nil {
		return handlePgErr(err)
	}

	return nil
}
