import { ClientResponseDto } from '../dto/client-response.dto';
import { CreateClientDto } from '../dto/create-client.dto';
import { PaginatedClientDto } from '../dto/paginated-client.dto';
import { UpdateClientDto } from '../dto/update-client.dto';
import { PlanDataDto } from '../dto/plan-data.dto';
import { PlanResponseDto } from '../dto/plan.dto';
import { PaginatedResponseDto } from 'common/utils/paginated-response.dto';
import { UserResponseDto } from 'modules/user/dto/user-response.dto';

export abstract class BaseClientService {
  abstract createClient(createClientDto: CreateClientDto): Promise<ClientResponseDto>;
  abstract getClientById(clientId: string): Promise<ClientResponseDto>;
  abstract updateClient(clientId: string, updateData: UpdateClientDto): Promise<ClientResponseDto>;
  abstract deleteClient(clientId: string): Promise<boolean>;
  abstract getAllClients(page?: number, limit?: number): Promise<PaginatedClientDto>;

  abstract linkUserToClient(clientId: string, userEmail: string): Promise<boolean>;
  abstract unlinkUserFromClient(clientId: string, userId: number): Promise<boolean>;
  abstract getClientUsers(clientId: string, page: number, limit: number): Promise<PaginatedResponseDto<UserResponseDto>>;
  abstract validateUserLinkLimit(clientId: string): Promise<boolean>;

  abstract upgradeUserToClient(userId: number, planData: PlanDataDto): Promise<ClientResponseDto>;
  abstract getClientPlan(clientId: string): Promise<PlanResponseDto>;
  abstract updateClientPlan(clientId: string, planDataDto: PlanDataDto): Promise<PlanResponseDto>;
}
