use std::fs::create_dir_all;

use lettre::{FileTransport, Transport};
use lettre_email::EmailBuilder;
use rocket::request::{Form, FromForm};
use rocket::response::{Flash, Redirect};
use rocket::{post, routes, Route};

#[derive(FromForm)]
struct Email {
    mail: String,
    subject: String,
    message: String,
}

fn send_mail(email: &Email) -> Result<(), String> {
    let email = EmailBuilder::new()
        .to("tm@tlater.net")
        .from(email.mail.clone())
        .subject(email.subject.clone())
        .text(email.message.clone())
        .build()
        .map_err(|err| format!("Invalid email contents: {}", err))?;

    let mut mailer = FileTransport::new("/srv/mail");
    if let Err(error) = create_dir_all("/srv/mail") {
        println!("Could not create mail directory: {}", error);
    };
    mailer.send(email.into()).map_err(|err| {
        println!("Could not save mail: {}", err);
        "Failed to send email due to internal issues; please try again later".to_string()
    })?;

    Ok(())
}

#[post("/mail.html", data = "<email>")]
fn mail_post(email: Form<Email>) -> Result<Flash<Redirect>, Flash<Redirect>> {
    match send_mail(&email) {
        Ok(_) => Ok(Flash::success(
            Redirect::to("/mail.html"),
            "Email sent successfully",
        )),
        Err(err) => Err(Flash::error(Redirect::to("/mail.html"), err)),
    }
}

pub fn routes() -> Vec<Route> {
    routes![mail_post]
}