package main

import "github.com/neo4j/neo4j-go-driver/neo4j"
import "fmt"
import "log"

func handle_if_error(err error) {
  if err != nil {
    log.Fatal("Error occured: %s", err)
  }
}

func main() {
  configForNeo4j40 := func(conf *neo4j.Config) { conf.Encrypted = false }
  driver, err := neo4j.NewDriver("bolt://localhost:7687",
                                 neo4j.BasicAuth("", "", ""),
                                 configForNeo4j40)
  if err != nil {
    log.Fatal("An error occurred opening conn: %s", err)
  }
  defer driver.Close()

  sessionConfig := neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite}
  session, err := driver.NewSession(sessionConfig)
  if err != nil {
    log.Fatal("An error occured while creating a session: %s", err)
  }
  defer session.Close()

  result, err := session.Run("MATCH (n) DETACH DELETE n;",
                             map[string]interface{}{})
  handle_if_error(err)
  _, err = result.Consume()
  handle_if_error(err)
  fmt.Println("Database cleared.")

  result, err = session.Run(`CREATE (alice:Person {name: "Alice", age: 22});`,
                            map[string]interface{}{})
  handle_if_error(err)
  _, err = result.Consume()
  handle_if_error(err)
  fmt.Println("Record created.")

  result, err = session.Run("MATCH (n) RETURN n;", map[string]interface{}{})
  handle_if_error(err)
  if !result.Next() {
    log.Fatal("Missing result.")
  }
  node_record, has_column := result.Record().Get("n")
  if !has_column {
    log.Fatal("Wrong result returned.")
  }
  node_value := node_record.(neo4j.Node)
  fmt.Println("Record matched.")

  label := node_value.Labels()[0]
  name := node_value.Props()["name"]
  age := node_value.Props()["age"]

  if label != "Person" && name != "Alice" && age != 22 {
    log.Fatal("Data doesn't match.")
  }

  fmt.Println("Label", label)
  fmt.Println("name", name)
  fmt.Println("age", age)

  fmt.Println("All ok!")
}
