import MockAdapter from 'axios-mock-adapter';

import MessengerClient from '../MessengerClient';

const ACCESS_TOKEN = '1234567890';

let axios;
let _create;
beforeEach(() => {
  axios = require('axios');
  _create = axios.create;
});

afterEach(() => {
  axios.create = _create;
});

const createMock = (): { client: MessengerClient; mock: MockAdapter } => {
  const client = new MessengerClient({
    accessToken: ACCESS_TOKEN,
  });
  const mock = new MockAdapter(client.axios);
  return { client, mock };
};

describe('persona api', () => {
  describe('#createPersona', () => {
    it('should call messenger api to create a persona', async () => {
      const { client, mock } = createMock();

      const reply = { id: '2222146701193608' };

      let url;
      let data;
      mock.onPost().reply((config) => {
        url = config.url;
        data = config.data;
        return [200, reply];
      });

      const res = await client.createPersona({
        name: 'kpman',
        profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
      });

      expect(url).toEqual(`/me/personas?access_token=${ACCESS_TOKEN}`);
      expect(JSON.parse(data)).toEqual({
        name: 'kpman',
        profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
      });

      expect(res).toEqual(reply);
    });
  });

  describe('#getPersona', () => {
    it('should get persona with the id given', async () => {
      const { client, mock } = createMock();

      const reply = {
        id: '311884619589478',
        name: 'kpman',
        profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
      };

      let url;
      mock.onGet().reply((config) => {
        url = config.url;
        return [200, reply];
      });

      const res = await client.getPersona('311884619589478');

      expect(url).toEqual(`/311884619589478?access_token=${ACCESS_TOKEN}`);

      expect(res).toEqual({
        name: 'kpman',
        profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
        id: '311884619589478',
      });
    });
  });

  describe('#getAllPersonas', () => {
    it('should call messenger api to get all created personas', async () => {
      const { client, mock } = createMock();

      const cursor =
        'QVFIUl96LThrbmJrU3gzOHdsR2JaZA2dDM01uaEJNaUZArWnNTNHBhQi1iZA3lvakk2YWlUR3F5bUV3UDJYZAWVxYnJyOFA1VnJwZAG9GUEVzOGRMZAzRsV08wdW1R';

      const replyWithCursor = {
        data: [
          {
            name: '7',
            profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '1007240332817468',
          },
          {
            name: '6',
            profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '243523459665626',
          },
          {
            name: '5',
            profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '313552169447330',
          },
        ],
        paging: {
          cursors: {
            before:
              'QVFIUktTaXVuTUtsYUpVdFhlQjVhV2tRMU1jY0tRekU0d1NVTS1fZAGw4YmFYakU3ay1vRnlKbUh4VktROWxvazQzLXQzbm1YN0M3SHRKaVBGTTVCNFlyZAXBn',
            after: cursor,
          },
          next: '/138523840252451/personas?access_token=0987654321&limit=25&after=QVFIUl96LThrbmJrU3gzOHdsR2JaZA2dDM01uaEJNaUZArWnNTNHBhQi1iZA3lvakk2YWlUR3F5bUV3UDJYZAWVxYnJyOFA1VnJwZAG9GUEVzOGRMZAzRsV08wdW1R',
        },
      };

      const replyWithoutCursor = {
        data: [
          {
            name: '8',
            profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '1007240332817468',
          },
          {
            name: '9',
            profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '243523459665626',
          },
          {
            name: '10',
            profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '313552169447330',
          },
        ],
      };

      mock
        .onGet(`/me/personas?access_token=${ACCESS_TOKEN}`)
        .replyOnce(200, replyWithCursor);

      mock
        .onGet(`/me/personas?access_token=${ACCESS_TOKEN}&after=${cursor}`)
        .replyOnce(200, replyWithoutCursor);

      const res = await client.getAllPersonas();

      expect(res).toEqual([
        {
          name: '7',
          profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
          id: '1007240332817468',
        },
        {
          name: '6',
          profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
          id: '243523459665626',
        },
        {
          name: '5',
          profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
          id: '313552169447330',
        },
        {
          name: '8',
          profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
          id: '1007240332817468',
        },
        {
          name: '9',
          profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
          id: '243523459665626',
        },
        {
          name: '10',
          profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
          id: '313552169447330',
        },
      ]);
    });
  });

  describe('#getPersonas', () => {
    it('should call messages api to get personas with cursor', async () => {
      const { client, mock } = createMock();

      const reply = {
        data: [
          {
            name: '7',
            profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '1007240332817468',
          },
          {
            name: '6',
            profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '243523459665626',
          },
          {
            name: '5',
            profile_picture_url: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '313552169447330',
          },
        ],
        paging: {
          cursors: {
            before:
              'QVFIUktTaXVuTUtsYUpVdFhlQjVhV2tRMU1jY0tRekU0d1NVTS1fZAGw4YmFYakU3ay1vRnlKbUh4VktROWxvazQzLXQzbm1YN0M3SHRKaVBGTTVCNFlyZAXBn',
            after:
              'QVFIUl96LThrbmJrU3gzOHdsR2JaZA2dDM01uaEJNaUZArWnNTNHBhQi1iZA3lvakk2YWlUR3F5bUV3UDJYZAWVxYnJyOFA1VnJwZAG9GUEVzOGRMZAzRsV08wdW1R',
          },
          next: '/138523840252451/personas?access_token=0987654321&limit=25&after=QVFIUl96LThrbmJrU3gzOHdsR2JaZA2dDM01uaEJNaUZArWnNTNHBhQi1iZA3lvakk2YWlUR3F5bUV3UDJYZAWVxYnJyOFA1VnJwZAG9GUEVzOGRMZAzRsV08wdW1R',
        },
      };

      const cursor =
        'QVFIUmRJYXR4Y3dBN1JpcU5pU0lfLWhZAS0IzMjZADZAWxWYksxLWVHdW1HSnJmV21paEZA3NEl2RW5LY25fRFZAnZAkg2OVBJR0VLZAXIzeFRTZAGFrSldjMVRlV3Fn';

      mock
        .onGet(`/me/personas?access_token=${ACCESS_TOKEN}&after=${cursor}`)
        .reply(200, reply);

      const res = await client.getPersonas(cursor);

      expect(res).toEqual({
        data: [
          {
            name: '7',
            profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '1007240332817468',
          },
          {
            name: '6',
            profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '243523459665626',
          },
          {
            name: '5',
            profilePictureUrl: 'https://i.imgur.com/zV6uy4T.jpg',
            id: '313552169447330',
          },
        ],
        paging: {
          cursors: {
            before:
              'QVFIUktTaXVuTUtsYUpVdFhlQjVhV2tRMU1jY0tRekU0d1NVTS1fZAGw4YmFYakU3ay1vRnlKbUh4VktROWxvazQzLXQzbm1YN0M3SHRKaVBGTTVCNFlyZAXBn',
            after:
              'QVFIUl96LThrbmJrU3gzOHdsR2JaZA2dDM01uaEJNaUZArWnNTNHBhQi1iZA3lvakk2YWlUR3F5bUV3UDJYZAWVxYnJyOFA1VnJwZAG9GUEVzOGRMZAzRsV08wdW1R',
          },
          next: '/138523840252451/personas?access_token=0987654321&limit=25&after=QVFIUl96LThrbmJrU3gzOHdsR2JaZA2dDM01uaEJNaUZArWnNTNHBhQi1iZA3lvakk2YWlUR3F5bUV3UDJYZAWVxYnJyOFA1VnJwZAG9GUEVzOGRMZAzRsV08wdW1R',
        },
      });
    });
  });

  describe('#deletePersona', () => {
    it('should call messages api to delete persona', async () => {
      const { client, mock } = createMock();

      const personaId = '291604368115617';

      const reply = {
        success: true,
      };

      let url;
      mock.onDelete().reply((config) => {
        url = config.url;
        return [200, reply];
      });

      const res = await client.deletePersona(personaId);

      expect(url).toEqual(`/291604368115617?access_token=${ACCESS_TOKEN}`);

      expect(res).toEqual(reply);
    });
  });
});
