package domain

import (
	"errors"
	"time"
)

var (
	ErrOtpNotFound    = errors.New("otp not found")
	ErrOtpAlreadyUsed = errors.New("otp already used")
	ErrInvalidOtp     = errors.New("invalid otp")
	ErrOtpExpired     = errors.New("otp expired")
)

type OtpFor string

const (
	OtpReset    OtpFor = "reset"
	OtpRegister OtpFor = "register"
)

type OtpMedium string

const (
	OtpMediumEmail OtpMedium = "email"
	OtpMediumSms   OtpMedium = "sms"
)

type Otp struct {
	ID        int64
	UserID    int64
	SentTo    string
	Medium    OtpMedium
	For       OtpFor
	Otp       string
	Used      bool
	UsedAt    time.Time
	CreatedAt time.Time
	ExpiresAt time.Time
}

type VerifyOtpReq struct {
	Email       string `json:"email"`
	PhoneNumber string `json:"phone_number"`
	Otp         string `json:"otp" validate:"required"`
}

type ResendOtpReq struct {
	Email       string `json:"email"`
	PhoneNumber string `json:"phone_number"`
}
