import fr.dcproject.entity.CitizenBasic
import fr.dcproject.entity.CitizenI
import fr.dcproject.entity.Constitution
import fr.dcproject.entity.User
import fr.postgresjson.serializer.deserialize
import fr.postgresjson.serializer.serialize
import io.ktor.locations.KtorExperimentalLocationsAPI
import io.ktor.util.KtorExperimentalAPI
import org.amshove.kluent.`should equal`
import org.amshove.kluent.shouldBe
import org.intellij.lang.annotations.Language
import org.joda.time.DateTime
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS

@KtorExperimentalLocationsAPI
@KtorExperimentalAPI
@TestInstance(PER_CLASS)
class ConstitutionTest {
    @Language("JSON")
    private val constitutionJson: String = """{  
       "id":"15814bb6-8d90-4c6a-a456-c3939a8ec75e",
       "title":"Hello world!",
       "anonymous":true,
       "titles":[  
          {  
             "id":"8156b66f-a9c8-4fd9-8375-a8a1f42ccfd2",
             "name":"plop",
             "rank":0,
             "created_by":{  
                "id":"18902d22-245d-4d44-b23d-9f0e82688612",
                "name":{  
                   "first_name":"Jaque",
                   "last_name":"Bono",
                   "civility":null
                },
                "email": "jaque.bono@gmail.com",
                "birthday":"2019-08-07T20:34:08.013Z",
                "user_id":null,
                "vote_anonymous":null,
                "follow_anonymous":null,
                "user":{  
                   "id":"257abe9f-be17-4ad3-ae6a-b1dc9706d5d7",
                   "username":"jaque",
                   "blocked_at":null,
                   "plain_password":"azerty",
                   "created_at":null,
                   "updated_at":null
                },
                "created_at":null
             },
             "created_at":null
          }
       ],
       "created_by":{  
          "id":"18902d22-245d-4d44-b23d-9f0e82688612",
          "name":{  
             "first_name":"Jaque",
             "last_name":"Bono",
             "civility":null
          },
          "email": "jaque.bono@gmail.com",
          "birthday":"2019-08-07T20:34:08.013Z",
          "user_id":null,
          "vote_anonymous":null,
          "follow_anonymous":null,
          "user":{  
             "id":"257abe9f-be17-4ad3-ae6a-b1dc9706d5d7",
             "username":"jaque",
             "plain_password":"azerty"
          }
       },
       "created_at":null,
       "version_id":"3311a7af-2a62-4e31-b4cd-889f8ead9737",
       "version_number":null
    }""".trimIndent()

    @Test
    fun `test Constitution serialize`() {
        val user = User(username = "jaque", plainPassword = "azerty")
        val citizen = CitizenBasic(
            name = CitizenI.Name("Jaque", "Bono"),
            email = "jaque.bono@gmail.com",
            birthday = DateTime.now(),
            user = user
        )
        val title1 = Constitution.Title(
            name = "plop"
        )
        val constitution = Constitution(
            title = "Hello world!",
            anonymous = true,
            titles = mutableListOf(title1),
            createdBy = citizen
        )
        println(constitution.serialize())
        constitution.serialize().contains("""Hello world!""") shouldBe true
    }

    @Test
    fun `test Constitution Deserialize`() {
        val constitution2: Constitution = constitutionJson.deserialize()!!
        constitution2.id.toString() `should equal` "15814bb6-8d90-4c6a-a456-c3939a8ec75e"
    }
}
