import { ContactStatus } from "@prisma/client";
import { ContactSortBy, ContactsRepository, ContactWithLists, SortDirection } from "../repositories/contacts-repository";

const MAX_PAGE_SIZE = 100;

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

interface GetContactsPaginatedUseCaseResponse {
  items: ContactWithLists[];
  total: number;
  page: number;
  pageSize: number;
}

export class GetContactsPaginatedUseCase {
  constructor(private contactsRepository: ContactsRepository) {}

  async execute({
    page,
    pageSize,
    ...filters
  }: GetContactsPaginatedUseCaseRequest): Promise<GetContactsPaginatedUseCaseResponse> {
    const clampedPage = Math.max(page, 1);
    const clampedPageSize = Math.min(Math.max(pageSize, 1), MAX_PAGE_SIZE);
    const skip = (clampedPage - 1) * clampedPageSize;

    const [items, total] = await Promise.all([
      this.contactsRepository.findPaginated({ skip, take: clampedPageSize, ...filters }),
      this.contactsRepository.countFiltered(filters),
    ]);

    return { items, total, page: clampedPage, pageSize: clampedPageSize };
  }
}
