/** Copyright 2015 TappingStone, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */

package io.prediction.data.storage.jdbc

import grizzled.slf4j.Logging
import io.prediction.data.storage.App
import io.prediction.data.storage.Apps
import io.prediction.data.storage.StorageClientConfig
import scalikejdbc._

/** JDBC implementation of [[Apps]] */
class JDBCApps(client: String, config: StorageClientConfig, prefix: String)
  extends Apps with Logging {
  /** Database table name for this data access object */
  val tableName = JDBCUtils.prefixTableName(prefix, "apps")
  DB autoCommit { implicit session =>
    sql"""
    create table if not exists $tableName (
      id serial not null primary key,
      name text not null,
      description text)""".execute.apply()
  }

  def insert(app: App): Option[Int] = DB localTx { implicit session =>
    val q = if (app.id == 0) {
      sql"""
      insert into $tableName (name, description) values(${app.name}, ${app.description})
      """
    } else {
      sql"""
      insert into $tableName values(${app.id}, ${app.name}, $app{description}())
      """
    }
    Some(q.updateAndReturnGeneratedKey().apply().toInt)
  }

  def get(id: Int): Option[App] = DB readOnly { implicit session =>
    sql"SELECT id, name, description FROM $tableName WHERE id = ${id}".map(rs =>
      App(
        id = rs.int("id"),
        name = rs.string("name"),
        description = rs.stringOpt("description"))
    ).single().apply()
  }

  def getByName(name: String): Option[App] = DB readOnly { implicit session =>
    sql"SELECT id, name, description FROM $tableName WHERE name = ${name}".map(rs =>
      App(
        id = rs.int("id"),
        name = rs.string("name"),
        description = rs.stringOpt("description"))
    ).single().apply()
  }

  def getAll(): Seq[App] = DB readOnly { implicit session =>
    sql"SELECT id, name, description FROM $tableName".map(rs =>
      App(
        id = rs.int("id"),
        name = rs.string("name"),
        description = rs.stringOpt("description"))
    ).list().apply()
  }

  def update(app: App): Unit = DB localTx { implicit session =>
    sql"""
    update $tableName set name = ${app.name}, description = ${app.description}
    where id = ${app.id}""".update().apply()
  }

  def delete(id: Int): Unit = DB localTx { implicit session =>
    sql"DELETE FROM $tableName WHERE id = $id".update().apply()
  }
}
