/*
 * Copyright 2007-2010 WorldWide Conferencing, LLC
 *
 * 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 net.liftweb {
package record {
package field {

import scala.xml._
import net.liftweb.common._
import net.liftweb.http.S
import net.liftweb.json.JsonAST.{JInt, JNothing, JNull, JValue}
import net.liftweb.util._
import Helpers._
import S._

class IntField[OwnerType <: Record[OwnerType]](rec: OwnerType) extends NumericField[Int, OwnerType] {

  def owner = rec

  def this(rec: OwnerType, value: Int) = {
    this(rec)
    set(value)
  }

  def this(rec: OwnerType, value: Box[Int]) = {
    this(rec)
    setBox(value)
  }

  def setFromAny(in: Any): Box[Int] = setNumericFromAny(in, _.intValue)

  def setFromString(s: String): Box[Int] = s match {
    case "" if optional_? => setBox(Empty)
    case _                => setBox(tryo(java.lang.Integer.parseInt(s)))
  }

  def defaultValue = 0

  def asJValue: JValue = valueBox.map(i => JInt(BigInt(i))) openOr (JNothing: JValue)
  def setFromJValue(jvalue: JValue): Box[Int] = jvalue match {
    case JNothing|JNull if optional_? => setBox(Empty)
    case JInt(i)                      => setBox(Full(i.intValue))
    case other                        => setBox(FieldHelpers.expectedA("JInt", other))
  }

}

import _root_.java.sql.{ResultSet, Types}
import _root_.net.liftweb.mapper.{DriverType}

/**
 * An int field holding DB related logic
 */
abstract class DBIntField[OwnerType <: DBRecord[OwnerType]](rec: OwnerType) extends IntField[OwnerType](rec)
  with JDBCFieldFlavor[Int]{

  def targetSQLType = Types.INTEGER

  /**
   * Given the driver type, return the string required to create the column in the database
   */
  def fieldCreatorString(dbType: DriverType, colName: String): String = colName + " " + dbType.enumColumnType

  def jdbcFriendly(field : String) : Int = value

}

}
}
}