//

//  Esdia.swift

//  General purpose... YMMV

//

//  Created by coti on 25/3/16.

//  Copyright © 2016 coti. All rights reserved.

//

//  19. 4. 2017 (readDouble(prompt:) hinzugefügt

//  To Do - add readXXX for Int and Float without limits

//


import Foundation


enum OutputType {

  case error

  case standard

}


public class Esdia {

  

  public class func readInt(prompt:String?) -> Int? {

    var resultado:Int?

    repeat {

      if let p = prompt {

        print(p, terminator: "")

      }

      if let temp = readLine() {

        resultado = Int(temp)

        break

      }

    } while true

    

    return resultado

  }

  

  public class func readFloat(prompt:String?) -> Float? {

    var resultado:Float?

    repeat {

      if let p = prompt {

        print(p, terminator: "")

      }

      if let temp = readLine() {

        resultado = Float(temp)

        break

      }

    } while true

    

    return resultado

  }

  

  public class func readInt(prompt:String?, minValue:Int?, maxValue:Int?) -> Int? {

    var resultado:Int? = nil

    repeat {

      if let p = prompt,

        let min = minValue,

        let max = maxValue {

        print(p + " between \(min) and \(max) : ", terminator: "")

      } else {

        print("\nPrompt or valid interval undefined\n")

        break

      }

      if let temp = readLine() {

        resultado = Int(temp)

        if let r = resultado {

          if r >= minValue! && r <= maxValue! {

            break

          } else {

            print("\nPlease enter a value between \(minValue!) and \(maxValue!)\n")

          }

        }

      }

    } while true

    

    return resultado

  }

  

  

  public class func readDouble(prompt:String?, minValue:Double?, maxValue:Double?) -> Double? {

    var resultado:Double? = nil

    repeat {

      if let p = prompt,

        let min = minValue,

        let max = maxValue {

        print(p + " between \(min) and \(max) : ", terminator: "")

      } else {

        print("\nPrompt or valid interval undefined\n")

        break

      }

      if let temp = readLine() {

        resultado = Double(temp)

        if let r = resultado {

          if r >= minValue! && r <= maxValue! {

            break

          } else {

            print("\nPlease enter a value between \(minValue!) and \(maxValue!)\n")

          }

        }

      }

    } while true

    

    return resultado

  }

  public class func readDouble(withPrompt p:String = "") -> Double? {

    

    repeat {

      print(p, terminator: "")

      

      if let temp = readLine(), 

        let result = Double(temp) {

        return result

      }

      

    } while true

    

  }

  

  public class func readStringWithPrompt(_ prompt:String) -> String? {

    

    print("\(prompt)", terminator:" ")

    let x = readLine(strippingNewline: true)!

    return x

    

  }

  

  public class func writeMessage(_ message: String) {

    print("\u{001B}[;m\(message)")

  }

  

  public class func writeMessageToError(_ message: String) {

    fputs("\u{001B}[0;31m\(message)\u{001B}[;m\n", stderr)

  }

  

}