package fr.dcproject.elasticsearch

import org.elasticsearch.client.Request
import org.elasticsearch.client.RestClient
import org.slf4j.Logger
import org.slf4j.LoggerFactory

fun waitElasticsearchIsUp(client: RestClient) {
    val logger: Logger = LoggerFactory.getLogger("fr.dcproject.elasticsearch")
    val request = Request("GET", "/_cluster/health")
    repeat(40) {
        runCatching {
            client.performRequest(request).statusLine.statusCode
        }.onSuccess {
            if (it == 200) {
                logger.debug("Elasticsearch is Ready! Continue...")
                return
            } else {
                logger.debug("sleep 2s and retry...")
                Thread.sleep(2000)
            }
        }.onFailure {
            logger.debug("${it.message}, sleep 2s and retry...")
            Thread.sleep(2000)
        }
    }
    error("Elasticsearch is not ready")
}

fun configElasticIndexes(client: RestClient) {
    waitElasticsearchIsUp(client)

    /* Create index if not exist */
    client.run {
        if (performRequest(Request("HEAD", "/views?include_type_name=false")).statusLine.statusCode == 404) {
            Request(
                "PUT",
                "/views?include_type_name=false"
            ).apply {
                //language=JSON
                setJsonEntity(
                    """
                {
                  "settings": {
                    "number_of_shards": 5
                  },
                  "mappings": {
                    "properties": {
                      "logged": {
                        "type": "boolean"
                      },
                      "type": {
                        "type": "keyword"
                      },
                      "user_ref": {
                        "type": "keyword"
                      },
                      "id": {
                        "type": "keyword"
                      },
                      "version_id": {
                        "type": "keyword"
                      },
                      "ip": {
                        "type": "keyword"
                      },
                      "citizen_id": {
                        "type": "keyword"
                      },
                      "view_at": {
                        "type": "date"
                      }
                    }
                  }
                }
            """.trimIndent()
                )
            }.let {
                performRequest(it)
            }
        }
    }
}