import { Product, ProductDataSource } from "./types";

/**
 * Vázlat a későbbi éles adatforráshoz: Power BI dataset lekérdezése
 * a REST "executeQueries" végponton keresztül, DAX lekérdezéssel.
 *
 * Ez a fájl SZÁNDÉKOSAN nincs bekötve alapértelmezésként (lásd getDataSource()),
 * mert éles használathoz szükséges:
 *  - Azure AD service principal (client credentials flow) és a hozzá tartozó
 *    workspace/dataset jogosultság,
 *  - a pontos dataset- és tábla-/oszlopnevek egyeztetése a valós modellel,
 *  - a bejövő productId szigorú validálása (whitelist), hogy ne kerülhessen
 *    nem kívánt karakter a DAX stringbe.
 */
export class PowerBiProductDataSource implements ProductDataSource {
  constructor(
    private readonly config: {
      groupId: string;
      datasetId: string;
      getAccessToken: () => Promise<string>;
    }
  ) {}

  // A `language` paramétert (lásd lib/types.ts) ez a vázlat még nem használja -
  // élesítéskor a DAX lekérdezésbe / a lekérdezett tábla szűrésébe be kell
  // vezetni, hasonlóan az AxProductDataSource megoldásához.
  async getProductById(
    productId: string,
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    _language?: string
  ): Promise<Product | null> {
    if (!/^[A-Za-z0-9-]+$/.test(productId)) {
      throw new Error("Érvénytelen termékazonosító formátum.");
    }

    const token = await this.config.getAccessToken();
    const url = `https://api.powerbi.com/v1.0/myorg/groups/${this.config.groupId}/datasets/${this.config.datasetId}/executeQueries`;

    const daxQuery = `EVALUATE FILTER('Product', 'Product'[ProductID] = "${productId}")`;

    const response = await fetch(url, {
      method: "POST",
      headers: {
        Authorization: `Bearer ${token}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        queries: [{ query: daxQuery }],
        serializerSettings: { includeNulls: true },
      }),
    });

    if (!response.ok) {
      throw new Error(
        `Power BI lekérdezés sikertelen: ${response.status} ${response.statusText}`
      );
    }

    const data = await response.json();
    const rows: Record<string, unknown>[] =
      data?.results?.[0]?.tables?.[0]?.rows ?? [];

    if (rows.length === 0) {
      return null;
    }

    // FIGYELEM: az oszlopnevek (pl. "Product[ProductID]") a valós modell
    // alapján pontosítandók – ez itt csak feltételezett mezőleképezés.
    const row = rows[0];
    return {
      productId: String(row["Product[ProductID]"]),
      name: String(row["Product[Name]"]),
      breadcrumb: row["Product[Breadcrumb]"]
        ? String(row["Product[Breadcrumb]"])
        : undefined,
      category: String(row["Product[Category]"]),
      brand: row["Product[Brand]"] ? String(row["Product[Brand]"]) : undefined,
      ean: row["Product[EAN]"] ? String(row["Product[EAN]"]) : undefined,
      price: Number(row["Product[Price]"]),
      currency: String(row["Product[Currency]"] ?? "HUF"),
      stock: Number(row["Product[Stock]"]),
      deliveryEstimate: row["Product[DeliveryEstimate]"]
        ? String(row["Product[DeliveryEstimate]"])
        : undefined,
      description: String(row["Product[Description]"] ?? ""),
      // FIGYELEM: a valós modellben ez lehet egy blob storage / CDN URL
      // mező, vagy hiányozhat is - ez esetben placeholder képre kell esni.
      imageUrl: String(row["Product[ImageUrl]"] ?? "/products/placeholder.svg"),
      // FIGYELEM: a benefits/specs/relatedProducts mezők valószínűleg nem
      // egyetlen lapos sorból jönnek, hanem kapcsolódó táblákból (pl.
      // 'ProductBenefit', 'ProductSpec', 'RelatedProduct'), amikhez külön
      // DAX lekérdezés és összefésülés szükséges - ez itt még nincs
      // implementálva, élesítéskor kell kidolgozni.
    };
  }
}
