import bcrypt from 'bcryptjs';
import jwt from 'jsonwebtoken';
import { Role, User } from '../../src/models';
import { Info, IUserInfo } from '../../src/utils/types';
import { id } from './misc';

const defaultUser: Info = {
  company_id: id(),
  company_name: 'name of company',
  firstName: 'firstName',
  lastName: 'lastName',
  isCompany: false,
  isActive: true,
  userType: 'staff',
  email: 'test1@email.com',
  phoneNumber: '+2348012345678',
};

const riderUser: Info = {
  company_id: id(),
  company_name: 'name of company',
  firstName: 'riderfirstName',
  lastName: 'riderlastName',
  isCompany: false,
  isActive: true,
  userType: 'rider',
  role_id: id(),
  email: 'rider@email.com',
  phoneNumber: '+2348012345477',
  address: 'address',
};

export const getToken = (payload: Info | IUserInfo) => {
  const pass = process.env.JWT_KEY!;
  return jwt.sign(payload, pass, { expiresIn: process.env.JWT_EXPIRES_IN! });
};

export const createTestUser = async (payload: Info = {}) => {
  defaultUser.password = await bcrypt.hash('testpass', 8);
  const data = payload;
  if (data.password) {
    const pass = data.password as string;
    data.password = await bcrypt.hash(pass, 8);
  }

  return User.create({
    ...defaultUser,
    ...data,
  });
};

export const createCompanyUser = async (payload = {}) =>
  createTestUser({ isCompany: true, userType: 'company', ...payload });

export const createRider = async (payload: Info) => {
  riderUser.password = await bcrypt.hash('testpass', 8);
  return User.create({ ...riderUser, ...payload });
};

export const logInUser = async (payload: any = {}) => {
  const { role_id } = payload;
  const role = await Role.findById(role_id);
  return `Bearer ${getToken({ ...defaultUser, ...payload, role_id: role })}`;
};
export const logInCompanyUser = (payload = {}) =>
  logInUser({
    ...defaultUser,
    isCompany: true,
    userType: 'company',
    ...payload,
  });

export const createRole = async (payload = {}) => {
  const defaultRole = {
    role: 'Role Title',
    permissions: [],
  };
  return Role.create({ ...defaultRole, ...payload });
};
