import { CMSApiClient } from "../client";
import { CMSAdvertisementType } from "../types";
import { CMSCollectionMeta } from "../types/shared";

export class CMSAdvertisement {
  private client: <TResponse>(
    path: string,
    init?: RequestInit,
    params?: Record<string, unknown>,
  ) => Promise<TResponse | null>;
  constructor(private headers?: RequestInit["headers"]) {
    const baseURL = process.env.STRAPI_API as string;
    const token = process.env.STRAPI_API_KEY as string;
    if (!baseURL || !token) {
      throw new Error("Missing API or API Token");
    }
    this.client = CMSApiClient(baseURL, token);
  }

  // Retrieve all advertisements
  async findAll(
    params?:
      | {
          filters?: Record<string, unknown> | undefined;
          populate?: Record<string, unknown> | undefined;
          sort?: string | undefined;
          fields?: string[] | undefined;
          pagination?: {
            type: "offset" | "page";
            start?: number;
            page?: number;
            limit?: number;
            pageSize?: number;
          };
        }
      | undefined,
  ): Promise<{
    advertisement: CMSAdvertisementType[];
    meta: CMSCollectionMeta | null;
  }> {
    try {
      const response = await this.client<{
        data: CMSAdvertisementType[];
        meta: CMSCollectionMeta;
      }>(
        params?.pagination ? `/advertisements` : "/ads",
        {
          method: "GET",
          headers: this.headers,
        },
        params,
      );
      if (!response) {
        return {
          advertisement: [],
          meta: null,
        };
      }
      return {
        advertisement: response.data,
        meta: response.meta,
      };
    } catch (err) {
      console.log(err);
      return {
        advertisement: [],
        meta: null,
      };
    }
  }

  // Retrieve an advertisement by slug
  async findBySlug(
    params?:
      | {
          filters?: Record<string, unknown> | undefined;
          populate?: Record<string, unknown> | undefined;
          sort?: string | undefined;
          fields?: string[] | undefined;
          pagination?: {
            type: "offset" | "page";
            start?: number;
            page?: number;
            limit?: number;
            pageSize?: number;
          };
        }
      | undefined,
  ): Promise<{
    advertisement: CMSAdvertisementType | null;
    meta: CMSCollectionMeta | null;
  }> {
    try {
      const response = await this.client<{
        data: CMSAdvertisementType[];
        meta: CMSCollectionMeta;
      }>(
        `/advertisements`,
        {
          method: "GET",
          headers: this.headers,
        },
        params,
      );
      if (!response) {
        return {
          advertisement: null,
          meta: null,
        };
      }
      return {
        advertisement: response.data[0],
        meta: response.meta,
      };
    } catch (err) {
      console.log(err);
      return {
        advertisement: null,
        meta: null,
      };
    }
  }
}
