#![feature(plugin)]
#![plugin(rocket_codegen)]

extern crate comrak;
extern crate glob;
extern crate inflector;
extern crate rocket;
extern crate rocket_contrib;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate serde_json;
extern crate toml;

mod handlers;
mod models;

use rocket::Rocket;
use std::fs::File;
use std::io::prelude::*;
use std::sync::RwLock;

type NoteStore = RwLock<Vec<models::note::Note>>;

#[derive(Debug, Deserialize)]
struct Config {
    title: String,
}

fn rocket(notes_path: Option<&str>) -> Rocket {
    let mut config_data = String::new();
    let mut config_file = File::open("config.toml").expect("Cannot find config file: config.toml");
    config_file
        .read_to_string(&mut config_data)
        .expect("Cannot read config file: config.toml");
    let config: Config =
        toml::from_str(&config_data).expect("Cannot parse config file: config.toml");

    let notes = models::note::Note::load_all(notes_path);

    rocket::ignite()
        .manage(RwLock::new(notes))
        .manage(config)
        .mount(
            "/",
            routes![handlers::home::index, handlers::static_files::all],
        )
        .mount(
            "/notes",
            routes![
                handlers::note::index,
                handlers::note::show_html,
                handlers::note::show_json,
                handlers::note::update
            ],
        )
        .attach(rocket_contrib::Template::fairing())
}

fn main() {
    rocket(None).launch();
}
