import nodemailer from 'nodemailer'
import { logger } from '../utils/logger'

interface EmailConfig {
  host: string
  port: number
  secure: boolean
  auth: {
    user: string
    pass: string
  }
}

interface SendEmailOptions {
  to: string
  subject: string
  text?: string
  html?: string
}

class EmailService {
  private transporter: nodemailer.Transporter | null = null
  private isEnabled: boolean = false

  constructor() {
    this.initializeTransporter()
  }

  private initializeTransporter() {
    const emailHost = process.env.EMAIL_HOST
    const emailPort = parseInt(process.env.EMAIL_PORT || '587')
    const emailUser = process.env.EMAIL_USER
    const emailPass = process.env.EMAIL_PASS
    const emailSecure = process.env.EMAIL_SECURE === 'true'

    if (emailHost && emailUser && emailPass) {
      const config: EmailConfig = {
        host: emailHost,
        port: emailPort,
        secure: emailSecure,
        auth: {
          user: emailUser,
          pass: emailPass
        }
      }

      this.transporter = nodemailer.createTransport(config)
      this.isEnabled = true
      logger.info('Email service initialized successfully')
    } else {
      logger.warn('Email service not configured. Set EMAIL_HOST, EMAIL_USER, EMAIL_PASS environment variables.')
      this.isEnabled = false
    }
  }

  async sendEmail(options: SendEmailOptions): Promise<boolean> {
    if (!this.isEnabled || !this.transporter) {
      logger.warn('Email service not enabled. Cannot send email.')
      return false
    }

    try {
      const info = await this.transporter.sendMail({
        from: process.env.EMAIL_FROM || process.env.EMAIL_USER,
        to: options.to,
        subject: options.subject,
        text: options.text,
        html: options.html
      })

      logger.info(`Email sent successfully to ${options.to}`, { messageId: info.messageId })
      return true
    } catch (error) {
      logger.error('Failed to send email:', error)
      return false
    }
  }

  async sendInitialPassword(email: string, password: string, firstName?: string): Promise<boolean> {
    const subject = 'SkillMate - Ihr Zugangs-Passwort'
    const text = `Hallo${firstName ? ` ${firstName}` : ''},

Ihr SkillMate-Konto wurde erstellt. Hier sind Ihre Anmeldedaten:

E-Mail: ${email}
Passwort: ${password}

Bitte loggen Sie sich ein und ändern Sie Ihr Passwort bei der ersten Anmeldung.

Login-URL: ${process.env.FRONTEND_URL || 'http://localhost:5173/login'}

Mit freundlichen Grüßen,
Ihr SkillMate-Team`

    const html = `
    <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
      <h2 style="color: #2563eb;">SkillMate - Ihr Zugangs-Passwort</h2>
      
      <p>Hallo${firstName ? ` ${firstName}` : ''},</p>
      
      <p>Ihr SkillMate-Konto wurde erstellt. Hier sind Ihre Anmeldedaten:</p>
      
      <div style="background-color: #f3f4f6; padding: 20px; border-radius: 8px; margin: 20px 0;">
        <p><strong>E-Mail:</strong> ${email}</p>
        <p><strong>Passwort:</strong> <code style="background-color: #e5e7eb; padding: 2px 4px; border-radius: 4px;">${password}</code></p>
      </div>
      
      <p>Bitte loggen Sie sich ein und ändern Sie Ihr Passwort bei der ersten Anmeldung.</p>
      
      <p>
        <a href="${process.env.FRONTEND_URL || 'http://localhost:5173/login'}" 
           style="background-color: #2563eb; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;">
          Jetzt einloggen
        </a>
      </p>
      
      <hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;">
      
      <p style="color: #6b7280; font-size: 14px;">
        Mit freundlichen Grüßen,<br>
        Ihr SkillMate-Team
      </p>
    </div>`

    return this.sendEmail({
      to: email,
      subject,
      text,
      html
    })
  }

  isServiceEnabled(): boolean {
    return this.isEnabled
  }
}

export const emailService = new EmailService()