import {insert} from "../../../backend/shared/lib/supabase/utils";
import {PrivateUser} from "../../../common/lib/user";
import {getDefaultNotificationPreferences} from "../../../common/lib/user-notification-preferences";
import {randomString} from "../../../common/lib/util/random";
import UserAccountInformation  from "../backend/utils/userInformation";

/**
 * Function used to populate the database with profiles.
 * 
 * @param pg - Supabase client used to access the database.
 * @param userInfo - Class object containing information to create a user account generated by `fakerjs`.
 * @param profileType - Optional param used to signify how much information is used in the account generation.
 */
export async function seedDatabase (pg: any, userInfo: UserAccountInformation, profileType?: string) {

  const userId = userInfo.user_id
  const deviceToken = randomString()
  const bio = {
    "type": "doc",
    "content": [
      {
        "type": "paragraph",
        "content": [
          {
            "text": userInfo.bio,
            "type": "text"
          }
        ]
      }
    ]
  }
  const basicProfile = {
    user_id: userId,
    bio_length: userInfo.bio.length,
    bio: bio,
    age: userInfo.age,
    born_in_location: userInfo.born_in_location,
    company: userInfo.company,
  }

  const mediumProfile = {
    ...basicProfile,
    drinks_per_month: userInfo.drinks_per_month,
    diet: [userInfo.randomElement(userInfo.diet)],
    education_level: userInfo.randomElement(userInfo.education_level),
    ethnicity: [userInfo.randomElement(userInfo.ethnicity)],
    gender: userInfo.randomElement(userInfo.gender),
    height_in_inches: userInfo.height_in_inches,
    pref_gender: [userInfo.randomElement(userInfo.pref_gender)],
    pref_age_min: userInfo.pref_age.min,
    pref_age_max: userInfo.pref_age.max,
  }

  const fullProfile = {
    ...mediumProfile,
    occupation_title: userInfo.occupation_title,
    political_beliefs: [userInfo.randomElement(userInfo.political_beliefs)],
    pref_relation_styles: [userInfo.randomElement(userInfo.pref_relation_styles)],
    religion: [userInfo.randomElement(userInfo.religion)],
  }

  const profileData = profileType === 'basic' ? basicProfile
    : profileType === 'medium' ? mediumProfile
    : fullProfile

  const user = {
    // avatarUrl,
    isBannedFromPosting: false,
    link: {},
  }

  const privateUser: PrivateUser = {
    id: userId,
    email: userInfo.email,
    initialIpAddress: userInfo.ip,
    initialDeviceToken: deviceToken,
    notificationPreferences: getDefaultNotificationPreferences(),
    blockedUserIds: [],
    blockedByUserIds: [],
  }

  await pg.tx(async (tx:any) => {

    await insert(tx, 'users', {
      id: userId,
      name: userInfo.name,
      username: userInfo.name,
      data: user,
    })

    await insert(tx, 'private_users', {
      id: userId,
      data: privateUser,
    })

    await insert(tx, 'profiles', profileData )

  })
};