package controllers

import javax.inject._
import play.api.mvc._
import play.api.libs.json.JsValue

import models.{Daily}
import models.exceptions.{ConflictException, NotFoundException}

import scala.concurrent.TimeoutException
import org.bson.types.ObjectId

/**
 * This controller handles all the Daily endpoints.
 */
@Singleton
class DailyController @Inject()(val controllerComponents: ControllerComponents) extends BaseController {

  /**
   * Create an Action to fetch all the Dailies in the DB.
   */
  def getAll() = Action {
    println("DailyController:getAll")

    try {
        val result: Seq[Daily] = Daily.getAllDailiesAsync()
        val jsonResult: JsValue = Daily.toJson(result)
        Ok(jsonResult)
    } catch {
        case _: TimeoutException => BadRequest("Request timed out")
        case _: Throwable => BadRequest("Exception raised")
    }
  }

  /**
   * Create an Action to fetch the user's Dailies in the DB.
   */
  def getUserDailies(userId: String) = Action {
    println("DailyController:getUserDailies")

    try {
        val result: Seq[Daily] = Daily.getUserDailiesAsync(new ObjectId(userId))
        val jsonResult: JsValue = Daily.toJson(result)
        Ok(jsonResult)
    } catch {
        case _: TimeoutException => BadRequest("Request timed out")
        case _: Throwable => BadRequest("Exception raised")
    }
  }

  /**
   * Create an Action to fetch the user's Feed.
   */
  def getUserFeed(userId: String) = Action {
    println("DailyController:getUserFeed")

    try {
        val result: Seq[Daily] = Daily.getUserFeedAsync(new ObjectId(userId))
        val jsonResult: JsValue = Daily.toJson(result)
        Ok(jsonResult)
    } catch {
        case _: TimeoutException => BadRequest("Request timed out")
        case _: Throwable => BadRequest("Exception raised")
    }
  }

  /**
   * Create an Action to create a Daily.
   */
  def create(userId: String, questionId: String, content: String) = Action {
    println("DailyController:create")

    try {
        // Dummy data
        val result: Daily = Daily.createDailyAsync(new ObjectId(userId), new ObjectId(questionId), content)
        val jsonResult: JsValue = Daily.toJson(result)
        Ok(jsonResult)
    } catch {
        case _: TimeoutException => BadRequest("Request timed out")
        case _: Throwable => BadRequest("Exception raised")
    }
  }

  /**
   * Create an Action to like a Daily.
   */
  def like(dailyId: String, likerId: String) = Action {
    println("DailyController:like")

    try {
        // Dummy data
        Daily.likeAsync(new ObjectId(dailyId), new ObjectId(likerId))
        Ok("Updated")
    } catch {
        case _: TimeoutException => BadRequest("Request timed out")
        case ex: ConflictException => BadRequest(ex.getMessage())
        case ex: NotFoundException => BadRequest(ex.getMessage())
        case _: Throwable => BadRequest("Exception raised")
    }
  }

   /**
   * Create an Action to unlike a Daily.
   */
  def unlike(dailyId: String, likerId: String) = Action {
    println("DailyController:unlike")

    try {
        // Dummy data
        Daily.unlikeAsync(new ObjectId(dailyId), new ObjectId(likerId))
        Ok("Updated")
    } catch {
        case _: TimeoutException => BadRequest("Request timed out")
        case ex: ConflictException => BadRequest(ex.getMessage())
        case ex: NotFoundException => BadRequest(ex.getMessage())
        case _: Throwable => BadRequest("Exception raised")
    }
  }
}