package user

import (
	"Yimaru-Backend/internal/domain"
	"Yimaru-Backend/internal/ports"
	"context"
)

type UserStore interface {
	GetProfileCompletionStatus(ctx context.Context, userId int64) (ports.ProfileCompletionStatus, error)
	UpdateUserKnowledgeLevel(ctx context.Context, userID int64, knowledgeLevel string) error
	IsUserPending(ctx context.Context, userName string) (bool, error)
	GetUserByUserName(
		ctx context.Context,
		userName string,
	) (domain.User, error)
	VerifyOtp(ctx context.Context, sentTo string, otpFor domain.OtpFor, medium domain.OtpMedium, otpCode string) error
	CreateUser(ctx context.Context, user domain.User, usedOtpId int64, is_company bool) (domain.User, error)
	CreateUserWithoutOtp(ctx context.Context, user domain.User, is_company bool) (domain.User, error)
	GetUserByID(ctx context.Context, id int64) (domain.User, error)
	GetAllUsers(ctx context.Context, filter domain.UserFilter) ([]domain.User, int64, error)
	GetAdminByCompanyID(ctx context.Context, companyID int64) (domain.User, error)
	UpdateUser(ctx context.Context, user domain.UpdateUserReq) error
	UpdateUserCompany(ctx context.Context, id int64, companyID int64) error
	UpdateUserSuspend(ctx context.Context, id int64, status bool) error
	DeleteUser(ctx context.Context, id int64) error
	CheckPhoneEmailExist(ctx context.Context, phoneNum, email string, companyID domain.ValidInt64) (bool, bool, error)
	GetUserByEmail(ctx context.Context, email string, companyID domain.ValidInt64) (domain.User, error)
	GetUserByPhone(ctx context.Context, phoneNum string, companyID domain.ValidInt64) (domain.User, error)
	SearchUserByNameOrPhone(ctx context.Context, searchString string, role *domain.Role, companyID domain.ValidInt64) ([]domain.User, error)
	UpdatePassword(ctx context.Context, identifier string, password []byte, usedOtpId int64, companyId int64) error

	GetCustomerCounts(ctx context.Context, filter domain.ReportFilter) (total, active, inactive int64, err error)
	GetCustomerDetails(ctx context.Context, filter domain.ReportFilter) (map[int64]domain.CustomerDetail, error)
	GetBranchCustomerCounts(ctx context.Context, filter domain.ReportFilter) (map[int64]int64, error)
	GetRoleCounts(ctx context.Context, role string, filter domain.ReportFilter) (total, active, inactive int64, err error)
	RegisterDevice(ctx context.Context, userID int64, deviceToken, platform string) error
	GetUserDeviceTokens(ctx context.Context, userID int64) ([]string, error)
}
type SmsGateway interface {
	SendSMSOTP(ctx context.Context, phoneNumber, otp string) error
}
type EmailGateway interface {
	SendEmailOTP(ctx context.Context, email string, otp string) error
}
type OtpStore interface {
	ResendOtp(
		ctx context.Context,
		userName string,
	) error
	CreateOtp(ctx context.Context, otp domain.Otp) error
	GetOtp(ctx context.Context, userName string) (domain.Otp, error)
}
