import RNTest from './react-native-testkit/'
import React from 'react'
import RNFetchBlob from 'react-native-fetch-blob'

import {
  StyleSheet,
  Text,
  View,
  ScrollView,
  Dimensions,
  Image,
} from 'react-native';
const { Assert, Comparer, Info, prop } = RNTest
const describe = RNTest.config({
  group : '0.1.x - 0.4.x',
  expand : false,
  run : true
})

let { TEST_SERVER_URL, FILENAME, DROPBOX_TOKEN, styles, image } = prop()

describe('The check if it follows 301/302 redirection', (report, done) => {

  image = RNTest.prop('image')

  RNFetchBlob.fetch('GET', `${TEST_SERVER_URL}/redirect`)
  .then((resp) => {
    report(
      <Assert key="check image size" expect={image.length} actual={resp.base64().length}/>,
      <Info key="Response image">
        <Image
          style={{width:Dimensions.get('window').width*0.9, height : Dimensions.get('window').width*0.9,margin :16}}
          source={{uri : `data:image/png;base64, ${image}`}}/>
      </Info>)
      done()
  })

})

describe('Upload octet-stream image to Dropbox', (report, done) => {

  RNFetchBlob.fetch('POST', 'https://content.dropboxapi.com/2/files/upload', {
    Authorization : `Bearer ${DROPBOX_TOKEN}`,
    'Dropbox-API-Arg': '{\"path\": \"/rn-upload/'+FILENAME+'\",\"mode\": \"add\",\"autorename\": true,\"mute\": false}',
    'Content-Type' : 'application/octet-stream',
  }, image)
  .then((resp) => {
    resp = resp.json()
    report(
      <Assert key="confirm the file has been uploaded" expect={FILENAME} actual={resp.name}/>
    )
    done()
  })

})

describe('Upload multipart/form-data', (report, done) => {

  RNFetchBlob.fetch('POST', `${TEST_SERVER_URL}/upload-form`, {
      Authorization : "Bearer fsXcpmKPrHgAAAAAAAAAEGxFXwhejXM_E8fznZoXPhHbhbNhA-Lytbe6etp1Jznz",
      'Content-Type' : 'multipart/form-data',
    }, [
      { name : 'test-img', filename : 'test-img.png', data: image},
      { name : 'test-text', filename : 'test-text.txt', data: RNFetchBlob.base64.encode('hello.txt')},
      { name : 'field1', data : 'hello !!'},
      { name : 'field2', data : 'hello2 !!'}
    ])
  .then((resp) => {
    resp = resp.json()
    report(
      <Assert key="check posted form data #1" expect="hello !!" actual={resp.fields.field1}/>,
      <Assert key="check posted form data #2" expect="hello2 !!" actual={resp.fields.field2}/>,
    )
    done()
  })


})

describe('Compare uploaded multipart image', (report, done) => {
  let r1 = null
  RNFetchBlob.fetch('GET', `${TEST_SERVER_URL}/public/test-img.png`)
    .then((resp) => {
      r1 = resp
      return RNFetchBlob.fetch('GET', `${TEST_SERVER_URL}/public/test-text.txt`)
    })
    .then((resp) => {
      report(
        <Assert key="check file length" expect={image.length} actual={r1.base64().length}/>,
        <Assert key="check file content" expect={'hello.txt'} actual={resp.text()}/>
      )
      done()
    })

})

// added after 0.4.2

describe('Progress report test', (report, done) => {
  let received = 0
  RNFetchBlob
    .fetch('GET', `${TEST_SERVER_URL}/public/1mb-dummy`, {
      Authorization : 'Bearer abde123eqweje'
    })
    .progress((written, total) => {
      // report(<Info key={`progress = ${written} bytes / ${total} bytes`}/>)
      if(written === total)
        report(<Assert key="progress goes to 100%" expect={written} actual={total}/>)
    })
    .then((resp) => {
      report(<Assert key="response data should be correct event with progress listener"
        expect={resp.text().substr(0,10)} actual={"1234567890"}/>)
      done()
    })

})

// FIXME : not yet supported
// describe('Large file download test', (report, done) => {
  // let received = 0
  // RNFetchBlob.fetch('GET', `${TEST_SERVER_URL}/public/22mb-dummy`, {
  //   Authorization : 'Bearer abde123eqweje'
  // })
  // .then((resp) => {
    // report(<Assert key="not supported" expect={true} actual={false}/>)
    // done()
  // })

// })