import { ApiProperty } from '@nestjs/swagger';
import { CreatePesCampaignDto, PesCampaignResponseDto, UpdatePesCampaignDto } from '../dto/pes-campaign.dto';
import { CreatePesTemplateDto, PesTemplateResponseDto } from '../dto/pes-template.dto';
import { CreatePesSendingProfileDto, PesSendingProfileResponseDto, UpdatePesSendingProfileDto } from '../dto/pes-sending-profile.dto';
import { CreatePesLandingPageDto, PesLandingPageResponseDto, UpdatePesLandingPageDto } from '../dto/pes-landing-page.dto';
import { IsEmail } from 'class-validator';
import { PesVerifiedUserResponseDto } from '../dto/pes-verified-users.dto';
import { CreatePesRecipientGroupDto, PesRecipientGroupResponseDto } from '../dto/pes-recipient-group.dto';

export class VerifyEmailDto {
  @ApiProperty({
    description: 'Email address to verify',
    example: 'john@example.com',
  })
  email: string;

  @ApiProperty({
    description: 'One-time password (OTP) for verification',
    example: '123456',
  })
  otpCode: string;
}

export class ResendVerificationDto {
  @ApiProperty({
    description: 'Email address to resend verification',
    example: 'john@example.com',
    required: true,
  })
  email: string;
}

export class SendVerificationDto {
  @ApiProperty({
    description: 'Email address to resend verification',
    example: 'john@example.com',
    required: true,
  })
  @IsEmail()
  email: string;
}

export abstract class BasePesService {
  // Campaign methods
  abstract createVerifiedUser(email: string): Promise<PesVerifiedUserResponseDto>;
  abstract createCampaign(userEmail: string, campaignData: CreatePesCampaignDto): Promise<PesCampaignResponseDto>;
  abstract createTemplate(templateData: CreatePesTemplateDto): Promise<PesTemplateResponseDto>;
  abstract createSendingProfile(sendingProfileData: CreatePesSendingProfileDto): Promise<PesSendingProfileResponseDto>;
  abstract createLandingPage(landingPageData: CreatePesLandingPageDto): Promise<PesLandingPageResponseDto>; // Define LandingPage DTO as needed

  abstract updateCampaign(campaignId: string, campaignData: UpdatePesCampaignDto): Promise<PesCampaignResponseDto>;

  abstract deleteCampaign(campaignId: string): Promise<{ success: boolean; message: string }>;

  // Email verification methods
  abstract sendVerificationEmail(email: string, userEmail: string): Promise<{ success: boolean; message: string }>;

  abstract checkEmailVerificationStatus(email: string): Promise<{ isVerified: boolean }>;

  abstract verifyEmail(email: string, otpCode: string, userId: number): Promise<{ success: boolean; message: string }>;

  abstract resendVerificationEmail(email: string | ResendVerificationDto): Promise<{ success: boolean; message: string }>;

  // Template methods
  abstract getAllTemplates(): Promise<PesTemplateResponseDto[]>;
  abstract getTemplateById(templateId: string): Promise<PesTemplateResponseDto | null>;
  abstract updateTemplate(templateId: string, templateData: CreatePesTemplateDto): Promise<PesTemplateResponseDto>;
  abstract deleteTemplate(templateId: string): Promise<{ success: boolean; message: string }>;
  abstract getTemplatesByVerifiedUserId(verifiedUserId: string): Promise<PesTemplateResponseDto[]>;

  // Campaign methods
  abstract getCampaignByVerifiedUserEmail(email: string): Promise<PesCampaignResponseDto[] | null>;
  abstract sendCampaignEmail(email: string, campaignId: string): Promise<{ success: boolean; message: string }>;
  abstract sendTestEmail(email: string, templateId: string): Promise<{ success: boolean; message: string }>;

  // verified user methods
  abstract getVerifiedUserByEmail(email: string): Promise<PesVerifiedUserResponseDto | null>;

  // Sending profile methods
  abstract testSmtpConnection(smtpConfig: SMTPConnectionTestProp): Promise<{ success: boolean; message: string }>;
  abstract getSendingProfileById(profileId: string): Promise<PesSendingProfileResponseDto | null>;
  abstract getSendingProfilesByVerifiedUserId(verifiedUserId: string): Promise<PesSendingProfileResponseDto[]>;
  abstract updateSendingProfile(profileId: string, sendingProfileData: UpdatePesSendingProfileDto): Promise<PesSendingProfileResponseDto>;
  abstract deleteSendingProfile(profileId: string): Promise<{ success: boolean; message: string }>;

  // Landing page methods
  abstract getLandingPageById(pageId: string): Promise<PesLandingPageResponseDto | null>;
  abstract getLandingPagesByVerifiedUserId(verifiedUserId: string): Promise<PesLandingPageResponseDto[]>;
  abstract updateLandingPage(pageId: string, landingPageData: UpdatePesLandingPageDto): Promise<PesLandingPageResponseDto>;
  abstract deleteLandingPage(pageId: string): Promise<{ success: boolean; message: string }>;

  // Recipient group methods
  abstract createRecipientGroup(data: CreatePesRecipientGroupDto): Promise<PesRecipientGroupResponseDto>;
  abstract addRecipientsToGroup(groupId: string, emails: string[]): Promise<PesRecipientGroupResponseDto>;
  abstract removeRecipientsFromGroup(groupId: string, recipientIds: string[]): Promise<PesRecipientGroupResponseDto>;
  abstract getRecipientGroupByVerifiedUserId(verifiedUserId: string): Promise<PesRecipientGroupResponseDto[]>;
  abstract getRecipientGroupById(groupId: string): Promise<PesRecipientGroupResponseDto>;
  abstract removeRecipientGroup(groupId: string, verifiedUserId: string): Promise<PesRecipientGroupResponseDto[]>;

  // Recipient methods
}

export interface SMTPConnectionTestProp {
  smtpHost: string;
  smtpPort: number;
  smtpUsername: string;
  smtpPassword: string;
  smtpTls: boolean;
}
