// ALLA ON LUKUUN 2.1 LIITTYVÄ ESIMERKKI. SEN SISÄISTÄ TOIMINTAA EI TARVITSE YMMÄRTÄÄ.
// KAIKKEA SEURAAVASTA KOODISTA EI MYÖSKÄÄN OLE KIRJOITETTU ALOITTELIJAYSTÄVÄLLISEEN TYYLIIN.
package o1.yksittaisia

object papukaija:

  private var repertuaari = List("Huh hellettä ja rommia pullo", "Polly tahtoo keksin")

  def opiLause(uusiLause: String) =
    this.repertuaari = uusiLause :: this.repertuaari

  def vastaa(kuultuLause: String): String =

    def siisti(lause: String) =
      lause.replaceAll(raw"[^\w åäöÅÄÖ]+", "")

    def sanoiksi(lause: String) =
      siisti(lause).toLowerCase.split(" ").toSeq.filter( _.length > 2 )

    def syotteenEkaSana =
      siisti(kuultuLause).takeWhile( _ != ' ' )

    def esiintyySyotteessa(repertuaarinSana: String) =
      def lasketaanSamaksiKuin(syotteenSana: String) =
        o1.util.editDistance(syotteenSana, repertuaarinSana, 1) <= 1
      syotteenSanat.exists(lasketaanSamaksiKuin)

    def sisaltaaSananSyotteesta(repertuaarinLause: String) =
      sanoiksi(repertuaarinLause).exists(esiintyySyotteessa)

    lazy val syotteenSanat = sanoiksi(kuultuLause)
    val vastaus = this.repertuaari.find(sisaltaaSananSyotteesta).getOrElse(syotteenEkaSana)
    if vastaus.nonEmpty then vastaus + "!" else ""

  end vastaa

end papukaija

