import { AuthDeviceResponseDto, LoginCredentialDto, LoginResponseDto, UserResponseDto } from '@app/domain';
import { adminSignupStub, loginResponseStub, loginStub } from '@test';
import request from 'supertest';

export const authApi = {
  adminSignUp: async (server: any) => {
    const { status, body } = await request(server).post('/auth/admin-sign-up').send(adminSignupStub);

    expect(status).toBe(201);

    return body as UserResponseDto;
  },
  adminLogin: async (server: any) => {
    const { status, body } = await request(server).post('/auth/login').send(loginStub.admin);

    expect(body).toEqual(loginResponseStub.admin.response);
    expect(body).toMatchObject({ accessToken: expect.any(String) });
    expect(status).toBe(201);

    return body as LoginResponseDto;
  },
  login: async (server: any, dto: LoginCredentialDto) => {
    const { status, body } = await request(server).post('/auth/login').send(dto);

    expect(status).toEqual(201);
    expect(body).toMatchObject({ accessToken: expect.any(String) });

    return body as LoginResponseDto;
  },
  getAuthDevices: async (server: any, accessToken: string) => {
    const { status, body } = await request(server).get('/auth/devices').set('Authorization', `Bearer ${accessToken}`);

    expect(body).toEqual(expect.any(Array));
    expect(status).toBe(200);

    return body as AuthDeviceResponseDto[];
  },
  validateToken: async (server: any, accessToken: string) => {
    const { status, body } = await request(server)
      .post('/auth/validateToken')
      .set('Authorization', `Bearer ${accessToken}`);
    expect(body).toEqual({ authStatus: true });
    expect(status).toBe(200);
  },
};
