package repository

import (
	"context"
	"database/sql"
	"fmt"

	dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db"
	"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
	"github.com/jackc/pgx/v5/pgtype"
)

func (s *Store) CreateOtp(ctx context.Context, otp domain.Otp) error {
	return s.queries.CreateOtp(ctx, dbgen.CreateOtpParams{
		SentTo: otp.SentTo,
		Medium: string(otp.Medium),
		OtpFor: string(otp.For),
		Otp:    otp.Otp,
		ExpiresAt: pgtype.Timestamptz{
			Time:  otp.ExpiresAt,
			Valid: true,
		},
		CreatedAt: pgtype.Timestamptz{
			Time:  otp.CreatedAt,
			Valid: true,
		},
	})
}
func (s *Store) GetOtp(ctx context.Context, sentTo string, sentfor domain.OtpFor, medium domain.OtpMedium) (domain.Otp, error) {
	row, err := s.queries.GetOtp(ctx, dbgen.GetOtpParams{
		SentTo: sentTo,
		Medium: string(medium),
		OtpFor: string(sentfor),
	})
	if err != nil {
		fmt.Printf("OTP REPO error: %v sentTo: %v, medium: %v, otpFor: %v\n", err, sentTo, medium, sentfor)
		if err == sql.ErrNoRows {
			return domain.Otp{}, domain.ErrOtpNotFound
		}
		return domain.Otp{}, err
	}
	return domain.Otp{
		ID:        row.ID,
		SentTo:    row.SentTo,
		Medium:    domain.OtpMedium(row.Medium),
		For:       domain.OtpFor(row.OtpFor),
		Otp:       row.Otp,
		Used:      row.Used,
		UsedAt:    row.UsedAt.Time,
		CreatedAt: row.CreatedAt.Time,
		ExpiresAt: row.ExpiresAt.Time,
	}, nil
}
func (s *Store) MarkOtpAsUsed(ctx context.Context, otp domain.Otp) error {
	return s.queries.MarkOtpAsUsed(ctx, dbgen.MarkOtpAsUsedParams{
		ID: otp.ID,
		UsedAt: pgtype.Timestamptz{
			Time:  otp.UsedAt,
			Valid: true,
		},
	})
}
