use rocket::http::Status;
pub use rocket::response::Redirect;
use rocket::Rocket;
use rocket_contrib::json::JsonValue;

pub mod account;
pub mod channel;
pub mod guild;
pub mod root;
pub mod user;

#[derive(Responder)]
pub enum Response {
    #[response()]
    Ok(Option<JsonValue>),
    #[response()]
    Success(JsonValue),
    #[response()]
    Redirect(Redirect),
    #[response(status = 400)]
    BadRequest(JsonValue),
    #[response(status = 401)]
    Unauthorized(JsonValue),
    #[response(status = 404)]
    NotFound(JsonValue),
    #[response(status = 406)]
    NotAcceptable(JsonValue),
    #[response(status = 409)]
    Conflict(JsonValue),
    #[response(status = 410)]
    Gone(JsonValue),
    #[response(status = 422)]
    UnprocessableEntity(JsonValue),
    #[response(status = 429)]
    TooManyRequests(JsonValue),
    #[response(status = 500)]
    InternalServerError(JsonValue),
    #[response()]
    Error(Status),
}

pub fn mount(rocket: Rocket) -> Rocket {
    rocket
        .mount("/api", routes![root::root])
        .mount(
            "/api/account",
            routes![
                account::create,
                account::verify_email,
                account::resend_email,
                account::login,
                account::token
            ],
        )
        .mount(
            "/api/users",
            routes![
                user::me,
                user::user,
                user::lookup,
                user::dms,
                user::dm,
                user::get_friends,
                user::get_friend,
                user::add_friend,
                user::remove_friend
            ],
        )
        .mount(
            "/api/channels",
            routes![
                channel::channel,
                channel::delete,
                channel::messages,
                channel::get_message,
                channel::send_message,
                channel::edit_message,
                channel::delete_message
            ],
        )
        .mount(
            "/api/guild",
            routes![guild::my_guilds, guild::guild, guild::create_guild],
        )
}