import { Metadata } from "next";
import { redirect } from "next/navigation";

import PersonalInformation from "@/components/pages/participant/profile/tabs/personal-information";
import { PersonalInformationProfileSchema } from "@/types/profile/profile-update-schema";
import { CORE_ENDPOINTS } from "@/constants/api-mappings/external-api-mapping";
import { getProfileData, getOptions } from "@/services/general-actions";
import { retrieveUserSession, retrieveUserToken } from "@/lib/user-session";
import { INTERNAL_PAGES } from "@/constants/pages-mapping/internal-pages-mapping";

export const metadata: Metadata = {
  title: "Personal Information | Profile",
};

export default async function PersonalInformationPage() {
  const { userId } = (await retrieveUserSession()) || {};
  const userToken = await retrieveUserToken();

  if (!userToken) {
    redirect(INTERNAL_PAGES.participant.login);
  }

  const optionEndpoints = [
    CORE_ENDPOINTS.options.gender,
    CORE_ENDPOINTS.options.ethnicity,
    CORE_ENDPOINTS.options.nationality,
    CORE_ENDPOINTS.options.accessibility,
    CORE_ENDPOINTS.options.techAbility,
    CORE_ENDPOINTS.options.devices,
  ];

  const [
    genderOptions,
    ethnicityOptions,
    nationalityOptions,
    accessibilityOptions,
    techAbilityOptions,
    deviceOptions,
  ] = await Promise.all(
    optionEndpoints.map((endpoint) => getOptions(endpoint, userToken))
  );

  const participantData = await getProfileData(userToken);

  const { participant, personalInformation } = participantData;

  const profileData: PersonalInformationProfileSchema = {
    firstName: participant.firstName,
    lastName: participant.lastName,
    dateOfBirth: participant.dateOfBirth,
    genderId: personalInformation.genderId,
    ethnicityId: personalInformation.ethnicityId,
    nationalityIds: personalInformation.nationalityIds,
    accessibilitiesIds: personalInformation.accessibilitiesIds,
    techAbilityId: personalInformation.techAbilityId,
    deviceIds: personalInformation.deviceIds,
  };

  const options = {
    genderOptions,
    ethnicityOptions,
    nationalityOptions,
    accessibilityOptions,
    techAbilityOptions,
    deviceOptions,
  };

  return (
    <PersonalInformation
      options={options}
      profileData={profileData}
      userId={userId}
    />
  );
}
