import { javaPost } from './apiClient';

export interface HomepageCollectionTextFields {
  blockLabel: string | null;
  blockTitle: string | null;
  blockSubtitle: string | null;
}

interface HomepageCollectionImage {
  id?: number | null;
  key: string;
  fileName?: string | null;
  width?: number | null;
  height?: number | null;
  jogtulajdonos?: string | null;
  kepforrasa?: string | null;
  kepkeszitoje?: string | null;
  kepalairas?: string | null;
}

export interface HomepageCollectionCreation {
  id: string;
  alkotasAzonosito: string;
  alkotoAzonosito: string;
  ev: string | number | null;
  telepules: string | null;
  title: string;
  subtitle: string;
  nev: string;
  megjelenitendoNev: string;
  fokep: string | null;
  galeria: HomepageCollectionImage[];
}

export interface HomepageCollection {
  textFields: HomepageCollectionTextFields;
  creations: HomepageCollectionCreation[];
}

type HomepageCollectionApiResponse = {
  textFields?: unknown;
  creations?: unknown;
};

const EMPTY_TEXT_FIELDS: HomepageCollectionTextFields = {
  blockLabel: '',
  blockTitle: '',
  blockSubtitle: '',
};

const asRecord = (value: unknown): Record<string, unknown> | null =>
  value && typeof value === 'object' ? (value as Record<string, unknown>) : null;

const asString = (value: unknown): string | null =>
  typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;

const asStringOrNumber = (value: unknown): string | number | null => {
  if (typeof value === 'number' && Number.isFinite(value)) return value;
  if (typeof value === 'string' && value.trim().length > 0) return value.trim();
  return null;
};

const asNumber = (value: unknown): number | null => {
  if (typeof value === 'number' && Number.isFinite(value)) return value;
  if (typeof value === 'string' && value.trim().length > 0) {
    const parsed = Number(value);
    return Number.isFinite(parsed) ? parsed : null;
  }
  return null;
};

const firstString = (...values: unknown[]): string => {
  for (const value of values) {
    const normalized = asString(value);
    if (normalized) return normalized;
  }
  return '';
};

const toImage = (value: unknown): HomepageCollectionImage | null => {
  const image = asRecord(value);
  if (!image) return null;

  const key = asString(image.key);
  if (!key) return null;

  return {
    id: asNumber(image.id),
    key,
    fileName: asString(image.fileName),
    width: asNumber(image.width),
    height: asNumber(image.height),
    jogtulajdonos: asString(image.jogtulajdonos),
    kepforrasa: asString(image.kepforrasa),
    kepkeszitoje: asString(image.kepkeszitoje),
    kepalairas: asString(image.kepalairas),
  };
};

const normalizeTextFields = (value: unknown): HomepageCollectionTextFields => {
  const fields = asRecord(value);
  if (!fields) return EMPTY_TEXT_FIELDS;

  return {
    blockLabel: asString(fields.blockLabel) ?? '',
    blockTitle: asString(fields.blockTitle) ?? '',
    blockSubtitle: asString(fields.blockSubtitle) ?? '',
  };
};

const normalizeCreation = (value: unknown): HomepageCollectionCreation | null => {
  const creation = asRecord(value);
  if (!creation) return null;

  const alkotasAzonosito = asString(creation.alkotasAzonosito) ?? '';
  const id = firstString(creation.id, alkotasAzonosito);
  if (!id) return null;

  const imageToDisplay = toImage(creation.imageToDisplay);
  const gallery = Array.isArray(creation.galeria)
    ? creation.galeria.map((image) => toImage(image)).filter(Boolean)
    : [];

  const normalizedGallery =
    gallery.length > 0
      ? (gallery as HomepageCollectionImage[])
      : imageToDisplay
        ? [imageToDisplay]
        : [];

  const title = firstString(creation.title, creation.alkotasCime, creation.nev);
  const subtitle = firstString(creation.subtitle, creation.alkotoNeve, creation.megjelenitendoNev);

  return {
    id,
    alkotasAzonosito,
    alkotoAzonosito: asString(creation.alkotoAzonosito) ?? '',
    ev: asStringOrNumber(creation.ev),
    telepules: asString(creation.telepules),
    title,
    subtitle,
    nev: firstString(creation.nev, title),
    megjelenitendoNev: firstString(creation.megjelenitendoNev, subtitle),
    fokep: firstString(creation.fokep, imageToDisplay?.key, normalizedGallery[0]?.key),
    galeria: normalizedGallery,
  };
};

// 1 - Featured videos, 2 - Creator of the week, 3 - Creation selection,
// 4 - Map showcase, 5 - Birthday creators, 6 - Library news,
// 7 - Interactive creator picker, 8 - Parallel paths

export async function getHomepageCollection(
  collectionId: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
): Promise<HomepageCollection | null> {
  try {
    const response = (await javaPost('contentCollectionControl/getCollection', {
      id: collectionId,
    })) as HomepageCollectionApiResponse | null;

    if (!response || typeof response !== 'object') {
      return null;
    }

    const creations = Array.isArray(response.creations)
      ? response.creations
          .map((creation) => normalizeCreation(creation))
          .filter((creation): creation is HomepageCollectionCreation => Boolean(creation))
      : [];

    return {
      textFields: normalizeTextFields(response.textFields),
      creations,
    };
  } catch (error) {
    console.error(`Failed to get homepage collection (${collectionId}):`, error);
    return null;
  }
}
