"use server";

import { MarketingChannel } from "@prisma/client";

import { auth } from "@/config/auth";
import { AppError } from "@/core/errors/app-error";
import { PrismaContactListsRepository } from "../repositories/prisma-contact-lists-repository";
import { GetContactListsPaginatedUseCase } from "../use-cases/get-contact-lists-paginated-use-case";

export interface GetContactListsPaginatedActionParams {
  page: number;
  pageSize: number;
  search?: string;
  marketingChannel?: MarketingChannel;
  createdFrom?: string;
  createdTo?: string;
}

function parseDateParam(value: string | undefined): Date | undefined {
  if (!value) return undefined;
  const parsed = new Date(value);
  return Number.isNaN(parsed.getTime()) ? undefined : parsed;
}

export async function getContactListsPaginatedAction(params: GetContactListsPaginatedActionParams) {
  const session = await auth();
  if (!session?.user?.id) throw new Error("Unauthorized");

  try {
    const createdTo = parseDateParam(params.createdTo);
    if (createdTo) createdTo.setHours(23, 59, 59, 999);

    const useCase = new GetContactListsPaginatedUseCase(new PrismaContactListsRepository());
    const result = await useCase.execute({
      page: params.page,
      pageSize: params.pageSize,
      search: params.search,
      marketingChannel: params.marketingChannel,
      createdFrom: parseDateParam(params.createdFrom),
      createdTo,
      userId: session.user.id,
    });

    return {
      ...result,
      items: result.items.map((item) => ({
        ...item,
        createdAt: item.createdAt.toISOString(),
        updatedAt: item.updatedAt.toISOString(),
      })),
    };
  } catch (error) {
    if (error instanceof AppError) {
      throw new Error(error.message);
    }
    throw error;
  }
}
