import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model, Types } from 'mongoose';
import { INewsletterSubscription } from './interface/newsletter-subscription.interface';
import { NewsletterSubscription } from './newsletter-subscription.schema';

@Injectable()
export class NewsletterService {
  constructor(
    @InjectModel(NewsletterSubscription.name) private newsletterSubscriptionModel: Model<INewsletterSubscription>
  ) {}

  public async newsletterSubscribe(email: string): Promise<NewsletterSubscription> {
    const existingEmail = await this.findOne(email);
    if (existingEmail) {
      throw new HttpException('Email already exists', HttpStatus.BAD_REQUEST);
    }
    const createSubscription = new this.newsletterSubscriptionModel({ email: email });
    createSubscription.save();
    return await this.findOne(email);
  }

  public async newsletterUnsubscribe(email: string): Promise<NewsletterSubscription> {
    const subscription = await this.newsletterSubscriptionModel.findOne({ email: email }).exec();
    if (!subscription) {
      throw new HttpException('Invalid email', HttpStatus.BAD_REQUEST);
    }
    return subscription.deleteOne();
  }

  public async findOne(mail: string): Promise<NewsletterSubscription | undefined> {
    return this.newsletterSubscriptionModel.findOne({ email: mail }).exec();
  }

  public async searchNewsletterSubscription(searchString: string) {
    return this.newsletterSubscriptionModel.find({ email: new RegExp(searchString, 'i') }).exec();
  }

  public async deleteOneEmail(mail: string): Promise<NewsletterSubscription | undefined> {
    const subscription = await this.newsletterSubscriptionModel.findOne({ email: mail }).exec();
    if (!subscription) {
      throw new HttpException('Invalid  email', HttpStatus.BAD_REQUEST);
    }
    return subscription.deleteOne();
  }

  public async findAll(): Promise<NewsletterSubscription[]> {
    return await this.newsletterSubscriptionModel.find().exec();
  }
}