use super::super::get_db;
use super::scripts::LATEST_REVISION;

use log::info;
use mongodb::bson::doc;
use mongodb::options::CreateCollectionOptions;

pub async fn create_database() {
    info!("Creating database.");
    let db = get_db();

    db.create_collection("accounts", None)
        .await
        .expect("Failed to create accounts collection.");

    db.create_collection("users", None)
        .await
        .expect("Failed to create users collection.");

    db.create_collection("channels", None)
        .await
        .expect("Failed to create channels collection.");

    db.create_collection("messages", None)
        .await
        .expect("Failed to create messages collection.");

    db.create_collection("servers", None)
        .await
        .expect("Failed to create servers collection.");

    db.create_collection("migrations", None)
        .await
        .expect("Failed to create migrations collection.");

    db.create_collection("attachments", None)
        .await
        .expect("Failed to create attachments collection.");

    db.create_collection("channel_unreads", None)
        .await
        .expect("Failed to create channel_unreads collection.");

    db.create_collection("user_settings", None)
        .await
        .expect("Failed to create user_settings collection.");

    db.create_collection(
        "pubsub",
        CreateCollectionOptions::builder()
            .capped(true)
            .size(1_000_000)
            .build(),
    )
    .await
    .expect("Failed to create pubsub collection.");

    db.run_command(
        doc! {
            "createIndexes": "accounts",
            "indexes": [
                {
                    "key": {
                        "email": 1
                    },
                    "name": "email",
                    "unique": true,
                    "collation": {
                        "locale": "en",
                        "strength": 2
                    }
                },
                {
                    "key": {
                        "email_normalised": 1
                    },
                    "name": "email_normalised",
                    "unique": true,
                    "collation": {
                        "locale": "en",
                        "strength": 2
                    }
                }
            ]
        },
        None,
    )
    .await
    .expect("Failed to create account index.");

    db.run_command(
        doc! {
            "createIndexes": "users",
            "indexes": [
                {
                    "key": {
                        "username": 1
                    },
                    "name": "username",
                    "unique": true,
                    "collation": {
                        "locale": "en",
                        "strength": 2
                    }
                }
            ]
        },
        None,
    )
    .await
    .expect("Failed to create username index.");

    db.collection("migrations")
        .insert_one(
            doc! {
                "_id": 0,
                "revision": LATEST_REVISION
            },
            None,
        )
        .await
        .expect("Failed to save migration info.");

    info!("Created database.");
}