use actix_web::{web, App, HttpServer};
use migration::MigratorTrait;
use sea_orm::{Database, DatabaseConnection};
use std::env;

use routes::config;
mod auth;
mod controller;
mod routes;

#[derive(Clone)]
struct AppState {
    db: DatabaseConnection,
    secret: String,
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    #[cfg(debug_assertions)]
    println!("Running debug build -> enabling permissive CORS");

    dotenvy::dotenv().ok();

    let db_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
    let jwt_secret = env::var("TOKEN_SECRET").expect("TOKEN_SECRET must be set");

    let conn = Database::connect(&db_url)
        .await
        .expect("Connecting to Database failed");

    println!("Running Migrations");
    migration::Migrator::up(&conn, None)
        .await
        .expect("Running migrations failed");
    println!("Finished running migrations");

    let state = AppState {
        db: conn,
        secret: jwt_secret,
    };

    println!("Listening for connections...");
    HttpServer::new(move || {
        let cors = if cfg!(debug_assertions) {
            actix_cors::Cors::permissive()
        } else {
            actix_cors::Cors::default()
        };
        App::new()
            .wrap(cors)
            .app_data(web::Data::new(state.clone()))
            .configure(config)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}
