package repositories

import (
	configs "astrology-api/configs"
	usermodel "astrology-api/models/usermodel"
)

func FindSocialAccount(provider string, providerUID string) (*usermodel.UserSocialAccount, error) {

	var account usermodel.UserSocialAccount

	err := configs.DB.
		Where("provider = ? AND providerUid = ? AND isDelete = ?", provider, providerUID, false).
		First(&account).Error

	if err != nil {
		return nil, err
	}

	return &account, nil
}

func CreateSocialAccount(account *usermodel.UserSocialAccount) error {
	return configs.DB.Create(account).Error
}

func UpdateSocialAccount(account *usermodel.UserSocialAccount) error {
	return configs.DB.Save(account).Error
}

func FindSocialAccountsByUserID(userID uint) ([]usermodel.UserSocialAccount, error) {

	var accounts []usermodel.UserSocialAccount

	// Oldest first, so the caller can treat the last element as the newest link.
	err := configs.DB.
		Where("userId = ? AND isDelete = ?", userID, false).
		Order("id ASC").
		Find(&accounts).Error

	if err != nil {
		return nil, err
	}

	return accounts, nil
}

// FindOtherUserByMobile finds a user holding this mobile number who is not
// excludeUserID, so a social account cannot claim a number already in use.
func FindOtherUserByMobile(mobile string, excludeUserID uint) (*usermodel.User, error) {

	var user usermodel.User

	err := configs.DB.
		Where("contactNo = ? AND id <> ? AND isDelete = ?", mobile, excludeUserID, false).
		First(&user).Error

	if err != nil {
		return nil, err
	}

	return &user, nil
}

// FindOtherUserByEmail reports whether an email address already belongs to
// somebody else, which is what stops a social account claiming an address that
// is not its own.
func FindOtherUserByEmail(email string, excludeUserID uint) (*usermodel.User, error) {

	var user usermodel.User

	err := configs.DB.
		Where("email = ? AND id <> ? AND isDelete = ?", email, excludeUserID, false).
		First(&user).Error

	if err != nil {
		return nil, err
	}

	return &user, nil
}
