import {Options, NewUser, LoginUser, NewGroup, NewRole} from "../utils/DataSchema";
import request from "../utils/requests";

export default class Auth {
  options: Options;
  constructor(options: Options) {
    this.options = options;
    this.options.url = process.env.OCX_AUTH_BASE_URL || process.env.VUE_APP_OCX_AUTH_BASE_URL;
  }

  async register(data: NewUser) {
    const requestOptions: Options = {
      ...this.options,
      data
    };
    const url = `auth/user/add`;
    return request(`POST`, url, requestOptions);
  }

  async createUser(data: NewUser) {
    const requestOptions: Options = {
      ...this.options,
      data
    };
    const url = `auth/user/add`;
    return request(`POST`, url, requestOptions);
  }

  async updateUser(userId:string, data:NewUser){
    const requestOptions: Options = {
      ...this.options,
      data
    };    
    const url = `auth/user/update/${userId}`;
    return request(`PATCH`, url, requestOptions);
  }
  async login(data: LoginUser) {
    data.client_id = parseInt(process.env.PASSPORT_CLIENT_ID as string,10) || parseInt(process.env.VUE_APP_PASSPORT_CLIENT_ID as string,10)
    data.client_secret = process.env.PASSPORT_CLIENT_SECRET || process.env.VUE_APP_PASSPORT_CLIENT_SECRET;
    data.grant_type = "password",
    data.scope = "";
    const requestOptions: Options = {
      ...this.options,
      data
    };
    const url = `auth/login/token`;
    return request(`POST`, url, requestOptions);
  }

  async showUser(userId:number) {

    const requestOptions: Options = {
      ...this.options
    };
    const url = `auth/user/get/${userId}`;
    return request(`GET`, url, requestOptions);

  }

  async fetchUsers(){
    const requestOptions: Options = {
      ...this.options
    };
    const url = `auth/user/get`;
    return request(`GET`, url, requestOptions);
  }

  async getAuthenticatedUser() {

    const requestOptions: Options = {
      ...this.options
    };
    const url = `auth/client/verify`;
    return request(`GET`, url, requestOptions);
  }


  async createGroup(data: NewGroup){
    const requestOptions: Options = {
      ...this.options,
      data
    };
    const url = `auth/groups/add`;
    return request(`POST`, url, requestOptions);
  }

  async updateGroup(groupId:string, data: NewGroup){
    const requestOptions: Options = {
      ...this.options,
      data
    };
    const url = `auth/groups/update/${groupId}`;
    return request(`PATCH`, url, requestOptions);
  }

  async deleteGroup(groupId:string){
    const requestOptions: Options = {
      ...this.options,
    };
    const url = `auth/groups/remove/${groupId}`;
    return request(`DELETE`, url, requestOptions);
  }

  async fetchGroups(){
    const requestOptions: Options = {
      ...this.options
    };
    const url = `auth/groups`;
    return request(`GET`, url, requestOptions);
  }



  async createRole(data: NewRole){
    const requestOptions: Options = {
      ...this.options,
      data
    };
    const url = `auth/roles/add`;
    return request(`POST`, url, requestOptions);
  }

  async fetchRoles(){
    const requestOptions: Options = {
      ...this.options
    };
    const url = `auth/roles`;
    return request(`GET`, url, requestOptions);
  }

  async updateRole(roleId:string, data: NewRole){
    const requestOptions: Options = {
      ...this.options,
      data
    };
    const url = `auth/roles/update/${roleId}`;
    return request(`PATCH`, url, requestOptions);
  }

  async deleteRole(roleId:string){
    const requestOptions: Options = {
      ...this.options,
    };
    const url = `auth/roles/remove/${roleId}`;
    return request(`DELETE`, url, requestOptions);
  }
}
