use actix_web::{get, web, Responder, http::header::ContentType, HttpResponse, post};
use chrono::{DateTime, ParseError};

use crate::{DbPool, request::{error::ApiError, responses::GameNightResponse, requests::Gamenight}, schema::{self, user::User}};

use uuid::Uuid;

impl Gamenight {
    pub fn into_with_user(&self, user: User) -> Result<schema::gamenight::Gamenight, ParseError> {
        return Ok(schema::gamenight::Gamenight {
            datetime: DateTime::parse_from_rfc3339(&self.datetime)?.with_timezone(&chrono::Utc),
            id: Uuid::new_v4(),
            name: self.name.clone(),
            owner_id: user.id
        })
    }
}

#[get("/gamenights")]
pub async fn gamenights(pool: web::Data<DbPool>, _user: User) -> Result<impl Responder, ApiError> {
    let mut conn = pool.get().expect("couldn't get db connection from pool");
    let gamenights = schema::gamenights(&mut conn)?;

    Ok(HttpResponse::Ok()
        .content_type(ContentType::json())
        .body(serde_json::to_string(&GameNightResponse { gamenights })?)
    )
}

#[post("/gamenight")]
pub async fn gamenight(pool: web::Data<DbPool>, user: User, gamenight_data: web::Json<Gamenight>) -> Result<impl Responder, ApiError> {
    let mut conn = pool.get().expect("couldn't get db connection from pool");
    
    schema::gamenight::add_gamenight(&mut conn, gamenight_data.into_with_user(user)?)?;
    
    Ok(HttpResponse::Ok())
}