import request from "supertest"
import app from "../src/app"
import { Server, IncomingMessage, ServerResponse } from "http"
import * as dotenv from "dotenv"

dotenv.config({path: '../../.env'})
const port = parseInt(process.env.BAR_PORT || '3000')

let serveur : Server<typeof IncomingMessage, typeof ServerResponse>

describe("Test the otm city path", () => {

    test("It should response the 200 code for GET method", done => {
        request(app)
        .get("/otm/city")
        .query({'name':'La roche sur yon'})
        .then(response => {
            expect(response.statusCode).toBe(200)
            done()
        })
    })

    test("It should response the GET method with content", done => {
        const out = {
            "type": "FeatureCollection",
            "features": [{
                "type": "Feature",
                "id": "562635",
                "geometry": {
                    "type": "Point",
                    "coordinates": [
                        -1.4344594,
                        46.6686478
                    ]
                },
                "properties": {
                    "xid": "N4032296324",
                    "name": "Le 27 point carré",
                    "dist": 236.40360026,
                    "rate": 1,
                    "osm": "node/4032296324",
                    "kinds": "foods,bars,tourist_facilities"
                }
            }]
        }

        request(app)
        .get("/otm/city")
        .query({'name':'La roche sur yon', "radius": 240})
        .then(response => {
            console.log(response.text)
            expect(response.text).toEqual(JSON.stringify(out))
            done()
        })
    })

    test("It should response the 400 code for GET method", done => {
        request(app)
        .get("/otm/city")
        .then(response => {
            console.log(response.text)
            expect(response.statusCode).toBe(400)
            done()
        })
    })

    test("It should response the 200 code for GET method", done => {
        request(app)
        .get("/otm/radius")
        .query({'lon':'-1.4344594', 'lat' : '46.6686478', 'radius': '10'})
        .then(response => {
            expect(response.statusCode).toBe(200)
            done()
        })
    })

    test("It should response the 200 code for GET method (default radius)", done => {
        request(app)
        .get("/otm/radius")
        .query({'lon':'-1.4344594', 'lat' : '46.6686478'})
        .then(response => {
            expect(response.statusCode).toBe(200)
            done()
        })
    })

    test("It should response the 400 code for GET method (missing lon and lat)", done => {
        request(app)
        .get("/otm/radius")
        .then(response => {
            expect(response.statusCode).toBe(400)
            done()
        })
    })


    test("Get bar in radius from API", done  => {
        const out = {
            "type": "FeatureCollection",
            "features": [{
                "type": "Feature",
                "id": "562635",
                "geometry": {
                    "type": "Point",
                    "coordinates": [
                        -1.4344594,
                        46.6686478
                    ]
                },
                "properties": {
                    "xid": "N4032296324",
                    "name": "Le 27 point carré",
                    "dist": 0.17652159,
                    "rate": 1,
                    "osm": "node/4032296324",
                    "kinds": "foods,bars,tourist_facilities"
                }
            }]
        }
        request(app)
        .get("/otm/radius")
        .query({'lon':'-1.4344594', 'lat' : '46.6686478', 'radius': '10'})
        .then(response => {
            expect(response.text).toEqual(JSON.stringify(out))
            done()
        })
    })

    test("It should response the 200 code for GET method", done => {
        request(app)
        .get("/otm/poidetaill")
        .query({'id':'562635'})
        .then(response => {
            expect(response.statusCode).toBe(200)
            done()
        })
    })

    test("Get bar in radius from API", done  => {
    const out = {
        "xid": "N4032296324",
        "name": "Le 27 point carré",
        "address": {
          "road": "Rue Raymond Poincaré",
          "town": "La Roche-sur-Yon",
          "state": "Pays de la Loire",
          "county": "La Roche-sur-Yon",
          "suburb": "Zola",
          "country": "France",
          "postcode": "85000",
          "country_code": "fr",
          "house_number": "27",
          "neighbourhood": "Cité des Forges"
        },
        "rate": "1",
        "osm": "node/4032296324",
        "kinds": "foods,bars,tourist_facilities",
        "sources": {
          "geometry": "osm",
          "attributes": [
            "osm"
          ]
        },
        "otm": "https://opentripmap.com/en/card/N4032296324",
        "point": {
          "lon": -1.4344594478607178,
          "lat": 46.66864776611328
        }
      }
        request(app)
        .get("/otm/poidetaill")
        .query({'id':'562635'})
        .then(response => {
            expect(response.text).toEqual(JSON.stringify(out))
            done()
        })
    })

    test("It should response the 400 code for GET method (no id)", done => {
        request(app)
        .get("/otm/poidetaill")
        .then(response => {
            expect(response.statusCode).toBe(400)
            done()
        })
    })

    test("It should response the 200 code for GET method", done => {
        request(app)
        .get("/otm/box")
        .query({'lon1':'-1.435199','lon2':'-1.43519', 'lat1':'46.668460', 'lat2':'46.668461'})
        .then(response => {
            expect(response.statusCode).toBe(200)
            done()
        })
    })

    test("Get bar in box from API", done => {
        const out = {
            "type": "FeatureCollection",
            "features": [
            {
                "type": "Feature",
                "id": "562633",
                "geometry": {
                "type": "Point",
                "coordinates": [
                    -1.435197,
                    46.6684608
                ]
                },
                "properties": {
                "xid": "N4032296323",
                "name": "Le Cube",
                "rate": 1,
                "osm": "node/4032296323",
                "kinds": "foods,cafes,tourist_facilities"
                }
            }
            ]
        }
        request(app)
        .get("/otm/box")
        .query({'lon1':'-1.435199','lon2':'-1.43519', 'lat1':'46.668460', 'lat2':'46.668461'})
        .then(response => {
            expect(response.text).toEqual(JSON.stringify(out))
            done()
        })
    })

    test("Get bar in box from API lat reversed", done => {
        const out = {
            "type": "FeatureCollection",
            "features": [
            {
                "type": "Feature",
                "id": "562633",
                "geometry": {
                "type": "Point",
                "coordinates": [
                    -1.435197,
                    46.6684608
                ]
                },
                "properties": {
                "xid": "N4032296323",
                "name": "Le Cube",
                "rate": 1,
                "osm": "node/4032296323",
                "kinds": "foods,cafes,tourist_facilities"
                }
            }
            ]
        }
        request(app)
        .get("/otm/box")
        .query({'lon1':'-1.435199','lon2':'-1.43519', 'lat2':'46.668460', 'lat1':'46.668461'})
        .then(response => {
            expect(response.text).toEqual(JSON.stringify(out))
            done()
        })
    })

    test("It should response the 400 code for GET method (no coordonaite)", done => {
        request(app)
        .get("/otm/box")
        .then(response => {
            expect(response.statusCode).toBe(400)
            done()
        })
    })
})