package redis

import (
	"context"
	"time"

	"git.gocasts.ir/ebhomengo/niki/adapter/redis"
	richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
)

type RepositoryOtp struct {
	conn *redis.Adapter
}

func NewRepositoryOtp(conn *redis.Adapter) RepositoryOtp {
	return RepositoryOtp{conn: conn}
}

func (r RepositoryOtp) IsExistPhoneNumber(ctx context.Context, phoneNumber string) (bool, error) {
	const op = "RepositoryOtp.IsExistPhoneNumber"

	result, err := r.conn.Client().Exists(ctx, phoneNumber).Result()
	if err != nil {
		return false, richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err)
	}

	if result == 0 {
		return false, nil
	}

	return true, nil
}

func (r RepositoryOtp) SaveCodeWithPhoneNumber(ctx context.Context, phoneNumber string, code string, expireTime time.Duration) error {
	const op = "RepositoryOtp.SaveCodeWithPhoneNumber"

	_, err := r.conn.Client().Set(ctx, phoneNumber, code, expireTime).Result()
	if err != nil {
		return richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err)
	}

	return nil
}

func (r RepositoryOtp) GetCodeByPhoneNumber(ctx context.Context, phoneNumber string) (string, error) {
	const op = "RepositoryOtp.GetCodeByPhoneNumber"

	result, err := r.conn.Client().Get(ctx, phoneNumber).Result()
	if err != nil {
		return "", richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err)
	}

	return result, nil
}

func (r RepositoryOtp) DeleteCodeByPhoneNumber(ctx context.Context, PhoneNumber string) (bool, error) {
	const op = "RepositoryOtp.DeleteCodeByPhoneNumber"
	success, err := r.conn.Client().Del(ctx, PhoneNumber).Result()
	if err != nil {
		return false, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected)
	}
	if success != 1 {
		return false, nil
	}

	return true, nil
}
