// a library to wrap and simplify api calls
import apisauce from 'apisauce'
import Constant from '../library/Constant'

// our "constructor"
const create = (type = "") => {
  let api;
  // ------
  // STEP 1
  // ------
  //
  // Create and configure an apisauce-based api object.
  //
  const baseURL = 'https://tia.eksad.com/tia-reporting-dev/public/'
  switch (type) {
    case '':
      api = apisauce.create({
        // base URL is read from the "constructor"
        baseURL,
        // here are some default headers
        headers: {
          'Cache-Control': 'no-cache',
          Accept: 'application/json',
          'Content-Type': 'application/json',
        },
        // 60 second timeout...
        timeout: 60000
      })
      break;
    case 'UPLOAD':
      api = apisauce.create({
        // base URL is read from the "constructor"
        baseURL,
        // here are some default headers
        headers: {
          'Cache-Control': 'no-cache',
          Accept: 'application/json',
          'Content-Type': 'application/json',
        },
        // 40 second timeout...
        timeout: 100000
      })
      break;
    default:
      break;
  }

  api.addAsyncRequestTransform(request => async () => {
    var token
    try {
      const res = await localStorage.getItem(Constant.TOKEN)
      if (token != null) {
        token = res
        // alert(url)
        // api.setBaseURL(`${url}/api/`)
      } else {
        token = res
        // url = Constant.BASE_URL.MASTER + '/api/'
        // alert(url)
        // api.setBaseURL(`${url}/api/`)
      }
    } catch (error) {
      // console.tron.log(error)
    }
    // console.log(token)
    request.headers['token'] = token
    // console.tron.log(url)
  })

  // ------
  // STEP 2
  // ------
  //
  // Define some functions that call the api.  The goal is to provide
  // a thin wrapper of the api layer providing nicer feeling functions
  // rather than "get", "post" and friends.
  //
  // I generally don't like wrapping the output at this level because
  // sometimes specific actions need to be take on `403` or `401`, etc.
  //
  // Since we can't hide from that, we embrace it by getting out of the
  // way at this level.
  //
  const getRoot = () => api.get('')

  //Auth
  const login = (body) => api.post('auth/login', body)
  const resetPassword = (body) => api.post('auth/reset_password', body)
  const verification = (body) => api.post('email/reset_password', body)
  const isResetPassword = (userId) => api.post(`auth/is_reset_password/${userId}`)

  //Role
  const getRole = () => api.get('role/get_all_role')
  const getRoleActive = () => api.get('role/get_all_role_active')
  const getDetailRole = (roleId) => api.get(`role/get_role_by_id/${roleId}`)
  const searchRole = (body) => api.post('/role/search_role', body)
  const addRole = (body) => api.post('role/create_role', body)
  const editRole = (body) => api.post('role/update_role', body)
  const deleteRole = (roleId) => api.post(`role/delete_role/${roleId}`)

  //Menu
  const getMenu = () => api.get('menu/get_menu_hierarki')
  const getMenuByRole = () => api.get('menu/get_menu_hierarki_by_role')
  const getMenuByUser = () => api.get('menu/get_menu')
  const getPermission = (body) => api.post('permission/get_permission', body)

  //UNIT BISNIS
  const getUnitBisnis = () => api.get('business_unit/get_all_business_unit')
  const createUnitBisnis = (body) => api.post('/business_unit/create_business_unit', body)
  const updateUnitBisnis = (body) => api.post('/business_unit/update_business_unit', body)
  const searchUnitBisnis = (body) => api.post('/business_unit/search_business_unit', body)
  const checkUploadUnitBisnis = (body) => api.post('/business_unit/check_import', body)
  const uploadUnitBisnis = (body) => api.post('/business_unit/import_business_unit', body)
  const getUnitBisnisActive = () => api.get('business_unit/get_all_business_unit_active')
  const getDetailUnitBisnis = (id) => api.get(`business_unit/get_business_unit_by_id/${id}`)
  const deleteUnitBisnis = (id) => api.post(`business_unit/delete_business_unit/${id}`)

  // Perusahaan
  const getPerusahaan = () => api.get('company/get_all_company')
  const getPerusahaanActive = () => api.get('company/get_all_company_active')
  const createPerusahaan = (body) => api.post('/company/create_company', body)
  const updatePerusahaan = (body) => api.post('/company/update_company', body)
  const getPerusahaanHierarki = () => api.get('company/get_company_hierarki')
  const saveVisualisasiPerusahaan = (body) => api.post('company/save_visualization', body)
  const checkUploadPerusahaan = (body) => api.post('company/check_import', body)
  const getDetailPerusahaan = (id) => api.get(`company/get_company_by_id/${id}`)
  const uploadPerusahaan = (body) => api.post('company/import_company', body)
  const searchPerusahaan = (body) => api.post('company/search_company', body)
  const deletePerusahaan = (id) => api.post(`company/delete_company/${id}`)

  // APPROVAL MATRIX
  const getAM = () => api.get('approval_matrix/get_all_approval_matrix')
  const getApprovedByAM = () => api.get('approval_matrix/get_all_approver')
  const getTypeAM = () => api.get('approval_type/get_all_approval_type')
  const getOperatorAM = () => api.get('operator_type/get_all_operator_type')
  const getDetailAM = (id) => api.get(`approval_matrix/get_approval_matrix_by_id/${id}`)
  const searchAM = (body) => api.post('/approval_matrix/search_approval_matrix', body)
  const createAM = (body) => api.post('/approval_matrix/create_approval_matrix', body)
  const updateAM = (body) => api.post('/approval_matrix/update_approval_matrix', body)
  const updateVAM = (body) => api.post('/approval_matrix/save_visualization', body)
  const checkUploadAM = (body) => api.post('/approval_matrix/check_import', body)
  const uploadAM = (body) => api.post('approval_matrix/import_approval_matrix', body)
  const deleteAM = (id) => api.post(`approval_matrix/delete_approval_matrix/${id}`)

  //User
  const getUser = () => api.get('user/get_all_user')
  const getDetailUser = (userId) => api.get(`user/get_user_by_id/${userId}`)
  const searchUser = (body) => api.post('user/search_user', body)
  const createUser = (body) => api.post('user/create_user', body)
  const updateUser = (body) => api.post('user/update_user', body)
  const deleteUser = (userId) => api.post(`user/delete_user/${userId}`)
  const changePassword = (body) => api.post('/user/change_password', body)
  const checkUploadUser = (body) => api.post('/user/check_import', body)
  const uploadUser = (body) => api.post('/user/import_user', body)

  //Report Items
  const getReportItems = () => api.get('item_report/get_all_item_report')
  const getInputType = () => api.get('type_item_report/get_all_type_item_report')
  const getReportType = () => api.get('report/get_all_report')
  const getDetailReportItems = (userId) => api.get(`item_report/get_item_report_by_id/${userId}`)
  const searchReportItems = (body) => api.post('/item_report/search_item_report', body)
  const createReportItems = (body) => api.post('/item_report/create_item_report', body)
  const updateReportItems = (body) => api.post('/item_report/update_item_report', body)
  const checkUploadReportItems = (body) => api.post('/item_report/check_import', body)
  const uploadReportItems = (body) => api.post('/item_report/import_item_report', body)
  const getItemReportHierarki = (body) => api.post('item_report/get_item_report_hierarki', body)
  const saveVisualisasiReport = (body) => api.post('item_report/save_visualization', body)
  const getReportParent = (body) => api.post('item_report/get_parent_item_report', body)
  const deleteReportItems = (id) => api.post(`item_report/delete_item_report/${id}`)
  const getAllSettingByType = (body) => api.post('setting/get_all_setting_by_type', body)
  const createAllItemReport = (body) => api.post('item_report/create_all_item_report', body)
  const deleteAllItemReport = (body) => api.post('/item_report/delete_all_item_report', body)

  //PARAMETER
  const getAllParameter = () => api.get('/setting/get_all_setting')
  const getDetailParameter = (id) => api.get(`setting/get_setting_by_id/${id}`)
  const getAllGroup = () => api.get('/setting_group/get_all_setting_group')
  const getParameterByGroup = (groupID) => api.get(`/setting_type/get_all_setting_type_by_group/${groupID}`)
  const createParameter = (body) => api.post('setting/create_setting', body)
  const updateParameter = (body) => api.post('setting/update_setting', body)
  const checkUploadParameter = (body) => api.post('setting/check_import', body)
  const uploadParameter = (body) => api.post('/setting/import_setting', body)
  const searchParameter = (body) => api.post('setting/search_setting', body)
  const deleteParameter = (id) => api.post(`setting/delete_setting/${id}`)

  //Transaction
  const getReportTypeBody = (body) => api.post('transaction/master_budget/get_all_report', body)
  const getMasterBudgetAtt = (body) => api.post('transaction/master_budget/get_report_attachment', body)
  const uploadAttachment = (body) => api.post('transaction/master_budget/upload_attachment', body)
  const getRevision = (body) => api.post('transaction/master_budget/get_revision', body)
  const getPeriodeTransaction = () => api.get('transaction/get_periode')
  const deleteAttachment = (id) => api.post(`transaction/master_budget/delete_attachment/${id}`)
  const getDetailReportMB = (body) => api.post('/transaction/master_budget/get_report_hierarki', body)
  const getLastestUpdateMB = (body) => api.post('/transaction/master_budget/get_latest_update', body)
  const createSubmitReport = (body) => api.post('transaction/master_budget/create_submission_report', body)
  const getSubmission = (body) => api.post('transaction/master_budget/get_submission_id', body)
  const checkUploadMB = (body) => api.post('transaction/master_budget/check_import', body)
  const uploadMasterBudget = (body) => api.post('transaction/master_budget/import_master_budget', body)
  const validateSubmitReport = (body) => api.post('transaction/master_budget/validate_save', body)
  const getMonthTransaction = () => api.get('transaction/get_default_month')
  const countingFormula = (body) => api.post('transaction/counting_formula', body)
  const submitMasterBudget = (body) => api.post('transaction/master_budget/submit_master_budget', body)
  const checkIsSubmit = (body) => api.post('transaction/master_budget/is_can_submit', body)
  const checkApprover = () => api.get('transaction/master_budget/is_approver')
  const approvalSubmission = (body) => api.post('transaction/master_budget/approval_submission', body)
  const getCompanySubmitted = (body) => api.post('transaction/master_budget/get_company_submitted', body)
  const getLastPeriod = (idCompany) => api.get(`transaction/master_budget/get_last_periode/${idCompany}`) 
  const getSubmitMasterBudget = (body) => api.post('transaction/master_budget/get_latest_periode_submit', body)
  const createPeriodeRevision = (body) => api.post('transaction/master_budget/create_periode_revision', body)
  const getIdDeleteFromExcel = (body) => api.post('transaction/master_budget/delete_from_excel', body)
  const getDashboard = (body) => api.get('transaction/get_dashboard')
  const historyApproval = (body) => api.post('transaction/master_budget/history_approval', body)
  const getDashboardUser = () => api.get('transaction/get_dashboard_sub_co')
  const getDashboardMB = (body) => api.get('transaction/get_dashboard_table')

  const getOpetratingIndID = (body) => api.post('transaction/operating_indicator/get_operating_indicator_id', body)
  const getSubmitOI = (body) => api.post('transaction/operating_indicator/get_latest_periode_submit', body)
  const getLastPeriodOI = (idCompany) => api.get(`transaction/operating_indicator/get_last_periode/${idCompany}`) 
  const getAllOperatingInd = (body) => api.post('transaction/operating_indicator/get_all_report', body)
  const getOperatingIndDetail = (body) => api.post('transaction/operating_indicator/get_report_hierarki', body)
  const createOpetaingInd = (body) => api.post('transaction/operating_indicator/create_operating_indicator_report', body)
  const checkUploadOperatingInd = (body) => api.post('transaction/operating_indicator/check_import', body)
  const uploadOperatingInd = (body) => api.post('transaction/operating_indicator/import_operating_indicator', body)
  const getLastestUpdateOI = (body) => api.post('transaction/operating_indicator/get_latest_update', body)
  const getLastPeriodeOI = (idCompany) => api.post(`transaction/master_budget/get_last_periode/${idCompany}`)

  //OUTLOOK PA
  const getOutlookPAID = (body) => api.post('transaction/outlook_pa/get_outlook_pa_id', body)
  const getLastPeriodOLPA = (idCompany) => api.get(`/transaction/outlook_pa/get_last_periode/${idCompany}`)
  const getCompanySubmittedOLPA = (body) => api.post('transaction/outlook_pa/get_company_submitted', body)
  const getRevisionOLPA = (body) => api.post('transaction/outlook_pa/get_revision', body)
  const historyApprovalOLPA = (body) => api.post('transaction/outlook_pa/history_approval', body)
  const getSubmitOLPA = (body) => api.post('transaction/outlook_pa/get_latest_periode_submit', body)
  const getOLPAAtt = (body) => api.post('transaction/outlook_pa/get_report_attachment', body)
  const submitOLPA = (body) => api.post('transaction/outlook_pa/submit_outlook_pa', body)
  const getDetailReportOLPA = (body) => api.post('transaction/outlook_pa/get_report_hierarki', body)
  const getLastestUpdateOLPA = (body) => api.post('transaction/outlook_pa/get_latest_update', body)
  const createReportOLPA = (body) => api.post('transaction/outlook_pa/create_outlook_report', body)
  const checkUploadOLPA = (body) => api.post('transaction/outlook_pa/check_import', body)
  const validateSubmitReportOLPA = (body) => api.post('transaction/outlook_pa/validate_save', body)
  const uploadOLPA = (body) => api.post('transaction/outlook_pa/import_outlook_pa', body)
  const uploadAttOLPA = (body) => api.post('transaction/outlook_pa/upload_attachment', body)
  const deleteAttOLPA = (id) => api.post(`transaction/outlook_pa/delete_attachment/${id}`)
  const getReportOLPA = (body) => api.post('transaction/outlook_pa/get_all_report', body)
  const approvalSubmissionOLPA = (body) => api.post('transaction/outlook_pa/approval_submission', body)
  const checkApproverOLPA = () => api.get('transaction/outlook_pa/is_approver')

  //Template
  const downloadTemplate = (fileName, fileType) => api.get(`attachment/download_file?fileName=${fileName}&&fileType=${fileType}`)

  // UPLOAD FOTO
  const uploadFoto = (body) => api.post('attachment/upload_foto', body)

  // MANAGEMENT DOCUMENT
  // const getDocumentCategory = (body) => api.post('setting/get_all_setting_document_category', body)
  const getDocumentCategory = () => api.get('setting/get_all_setting_document_category')
  const getAllDocument = (body) => api.post('document/get_all_document', body)
  const uploadDocument = (body) => api.post('document/upload_document', body)
  const updateDocument = (body) => api.post('document/update_document', body)
  const downloadDocument = (body) => api.post('document/download_document', body)
  const getPerusahaanUserActive = () => api.get('company/get_all_user_company_active')
  const getDetailDocument = (id) => api.get(`document/get_document_by_id/${id}`)
  const deleteDocument = (id) => api.post(`document/delete_document/${id}`)

  // ------
  // STEP 3
  // ------
  //
  // Return back a collection of functions that we would consider our
  // interface.  Most of the time it'll be just the list of all the
  // methods in step 2.
  //
  // Notice we're not returning back the `api` created in step 1?  That's
  // because it is scoped privately.  This is one way to create truly
  // private scoped goodies in JavaScript.
  //
  return {
    // a list of the API functions from step 2
    getRoot,
    login,
    verification,
    resetPassword,
    isResetPassword,
    getRole,
    getDetailRole,
    searchRole,
    addRole,
    editRole,
    deleteRole,
    getMenu,
    getUnitBisnis,
    createUnitBisnis,
    updateUnitBisnis,
    searchUnitBisnis,
    getPerusahaan,
    createPerusahaan,
    updatePerusahaan,
    getAM,
    getApprovedByAM,
    getTypeAM,
    getOperatorAM,
    getDetailAM,
    searchAM,
    createAM,
    updateAM,
    updateVAM,
    checkUploadAM,
    uploadAM,
    deleteAM,
    getUser,
    getDetailUser,
    searchUser,
    createUser,
    updateUser,
    deleteUser,
    downloadTemplate,
    checkUploadUnitBisnis,
    uploadUnitBisnis,
    changePassword,
    getPerusahaanHierarki,
    checkUploadUser,
    uploadUser,
    getReportItems,
    searchReportItems,
    createReportItems,
    updateReportItems,
    getDetailReportItems,
    getInputType,
    getReportType,
    checkUploadReportItems,
    uploadReportItems,
    getAllParameter,
    getAllGroup,
    getParameterByGroup,
    getDetailParameter,
    updateParameter,
    createParameter,
    getPerusahaanActive,
    getRoleActive,
    checkUploadParameter,
    uploadParameter,
    getItemReportHierarki,
    getMenuByRole,
    saveVisualisasiReport,
    saveVisualisasiPerusahaan,
    getReportParent,
    searchParameter,
    checkUploadPerusahaan,
    getDetailPerusahaan,
    uploadPerusahaan,
    searchPerusahaan,
    getUnitBisnisActive,
    getMenuByUser,
    getDetailUnitBisnis,
    uploadFoto,
    getReportTypeBody,
    getPermission,
    getMasterBudgetAtt,
    uploadAttachment,
    getPeriodeTransaction,
    getMonthTransaction,
    getRevision,
    deleteAttachment,
    getDetailReportMB,
    deleteUnitBisnis,
    deleteParameter,
    deletePerusahaan,
    deleteReportItems,
    getDocumentCategory,
    getAllDocument,
    uploadDocument,
    updateDocument,
    downloadDocument,
    getPerusahaanUserActive,
    getDetailDocument,
    deleteDocument,
    createSubmitReport,
    getSubmission,
    checkUploadMB,
    getAllOperatingInd,
    getOperatingIndDetail,
    createOpetaingInd,
    uploadMasterBudget,
    getAllSettingByType,
    getOpetratingIndID,
    createAllItemReport,
    deleteAllItemReport,
    validateSubmitReport,
    checkUploadOperatingInd,
    uploadOperatingInd,
    getLastestUpdateMB,
    countingFormula,
    submitMasterBudget,
    checkIsSubmit,
    getIdDeleteFromExcel,
    getDashboard,
    historyApproval,
    getDashboardMB,
    checkApprover,
    approvalSubmission,
    getCompanySubmitted,
    getLastPeriod,
    getSubmitMasterBudget,
    createPeriodeRevision,
    getLastestUpdateOI,
    getOutlookPAID,
    getLastPeriodOLPA,
    getCompanySubmittedOLPA,
    getRevisionOLPA,
    historyApprovalOLPA,
    getSubmitOLPA,
    getOLPAAtt,
    submitOLPA,
    getLastestUpdateOLPA,
    createReportOLPA,
    checkUploadOLPA,
    uploadOLPA,
    validateSubmitReportOLPA,
    getDetailReportOLPA,
    uploadAttOLPA,
    deleteAttOLPA,
    getReportOLPA,
    approvalSubmissionOLPA,
    checkApproverOLPA,
    getLastPeriodeOI,
    getSubmitOI,
    getLastPeriodOI,
    getDashboardUser
  }
}

// let's return back our create method as the default.
export default {
  create
}