"use server";

import { auth } from "@/config/auth";
import { AppError } from "@/core/errors/app-error";
import { ContactSortBy, SortDirection } from "../repositories/contacts-repository";
import { PrismaContactsRepository } from "../repositories/prisma-contacts-repository";
import { GetContactsPaginatedUseCase } from "../use-cases/get-contacts-paginated-use-case";
import { ContactStatus } from "@prisma/client";

export interface GetContactsPaginatedActionParams {
  page: number;
  pageSize: number;
  search?: string;
  tag?: string;
  listId?: string;
  status?: ContactStatus;
  openedWithinDays?: number;
  subscribedWithinDays?: number;
  sortBy?: ContactSortBy;
  sortDir?: SortDirection;
}

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

  try {
    const useCase = new GetContactsPaginatedUseCase(new PrismaContactsRepository());
    const result = await useCase.execute(params);

    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;
  }
}
