import addressApi from '../api/address'
import nameApi from '../api/name'
import profileApi from '../api/profile'
import ensTextApi from '../api/text'
import { createServer } from 'vercel-node-server'
import listen from 'test-listen'
// import express from 'express'
// import request from 'supertest'
import axios from 'axios'
// import type { VercelRequest, VercelResponse } from '@vercel/node'
import { assert } from 'chai'

let server: any
let url: string
const name = 'jellymcjellyfish.eth'
const accountId = '0x99840Df5Cb42faBE0Feb8811Aaa4BC99cA6C84e0'
const invalid = 'lkdfjslkdfjpeoijf3423'

describe('Testing ENS proxy API endpoints', function () {
  this.timeout(25000)

  it('Requesting address should return the expected response', async () => {
    server = createServer(addressApi)
    url = await listen(server)
    const response = await axios.get(url, {
      params: {
        name
      }
    })
    assert(response.status === 200)
    assert(response.data.address === accountId)
  })
  it('Requesting ENS name should return the expected response', async () => {
    server = createServer(nameApi)
    url = await listen(server)
    const response = await axios.get(url, {
      params: {
        accountId
      }
    })
    assert(response.status === 200)
    assert(response.data.name === name)
  })
  it('Requesting text records should return the expected response', async () => {
    server = createServer(ensTextApi)
    url = await listen(server)
    const response = await axios.get(url, {
      params: {
        name
      }
    })
    assert(response.status === 200)
    assert(
      response.data.records[0].value === 'https://oceanprotocol.com',
      'Wrong URL'
    )
    assert(
      response.data.records[1].value ===
        'https://raw.githubusercontent.com/oceanprotocol/art/main/logo/favicon-white.png',
      'Wrong avatar'
    )
    assert(response.data.records[2].value === 'oceanprotocol', 'Wrong link 1')
    assert(response.data.records[3].value === 'oceanprotocol', 'wrong link 2')

    assert(response.data.records[0].key === 'url', 'Wrong URL')
    assert(response.data.records[1].key === 'avatar', 'Wrong avatar')
    assert(response.data.records[2].key === 'com.twitter', 'Wrong link 1')
    assert(response.data.records[3].key === 'com.github', 'wrong link 2')
  })

  it('Requesting user profile should return the expected response', async () => {
    server = createServer(profileApi)
    url = await listen(server)
    const response = await axios.get(url, {
      params: {
        address: accountId
      }
    })

    assert(response.status === 200)
    assert(response.data.profile.name === name)
    assert(
      response.data.profile.avatar ===
        'https://metadata.ens.domains/mainnet/avatar/jellymcjellyfish.eth'
    )
    assert(response.data.profile.links[0].value === 'https://oceanprotocol.com')
    assert(response.data.profile.links[1].value === 'oceanprotocol')
    assert(response.data.profile.links[2].value === 'oceanprotocol')

    assert(response.data.profile.links[0].key === 'url')
    assert(response.data.profile.links[1].key === 'com.twitter')
    assert(response.data.profile.links[2].key === 'com.github')
  })

  // Tests with incorrect address or name

  it('Requesting address should return status 200 with invalid name', async () => {
    server = createServer(addressApi)
    url = await listen(server)
    const response = await axios.get(url, {
      params: {
        name: invalid
      }
    })
    assert(response.status === 200)
  })
  it('Requesting name should return status 200 with invalid accountId', async () => {
    server = createServer(nameApi)
    url = await listen(server)
    const response = await axios.get(url, {
      params: {
        accountId: invalid
      }
    })
    assert(response.status === 200)
  })
  it('Requesting text records should return status 200 with invalid name', async () => {
    server = createServer(ensTextApi)
    url = await listen(server)
    const response = await axios.get(url, {
      params: {
        name: invalid
      }
    })
    assert(response.status === 200)
  })

  it('Requesting profile should return status 200 with invalid name', async () => {
    server = createServer(profileApi)
    url = await listen(server)
    const response = await axios.get(url, {
      params: {
        address: invalid
      }
    })

    assert(response.status === 200)
  })
})

after(() => {
  server.close()
})