{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Prerequisites:\n",
    "#!pip install requests\n",
    "#!pip install python-dotenv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from api import BigApi\n",
    "BigApi.init(\".admin.env\")\n",
    "BigApi.adminLogin()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from enum import Enum\n",
    "\n",
    "r = requests.get(f\"{adminApiUrl}/admin/shop/schemas\", headers=getAdminHeaders())\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "schemas = r.json()\n",
    "print(schemas)\n",
    "BigOrderAction = Enum(\"BigOrderAction\", dict([(v, k) for k, v in schemas[\"BigOrderAction\"].items()]))\n",
    "\n",
    "r = requests.get(f\"{adminApiUrl}/admin/fabricator/schemas\", headers=getAdminHeaders())\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "schemas2 = r.json()\n",
    "print(schemas2)\n",
    "JobStates = Enum(\"JobStates\", dict([(v, int(k)) for k, v in schemas2[\"JobStates\"].items()]))\n",
    "JobActions = Enum(\"JobActions\", dict([(v, int(k)) for k, v in schemas2[\"JobActions\"].items()]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import base64\n",
    "\n",
    "payload = {\n",
    "    \"email\": 'david+fabricator19@bigscreenvr.com',\n",
    "    \"firstName\": \"David\",\n",
    "    \"lastName\": \"Fabricator\",\n",
    "    \"name\": \"this is a test order\"\n",
    "}\n",
    "\n",
    "r = requests.post(f\"{adminApiUrl}/admin/shop/test_order\", headers=getAdminHeaders(), json=payload)\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "data = r.json()\n",
    "bigOrderId = data[\"id\"]\n",
    "\n",
    "r = requests.get(f\"{adminApiUrl}/admin/shop/order/{bigOrderId}\", headers=getAdminHeaders())\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "data = r.json()\n",
    "assert data[\"id\"] == bigOrderId, f\"bigOrderId should be {bigOrderId} (actual: {data['id']})\"\n",
    "\n",
    "# run the checklist to get the nextAction\n",
    "r = requests.get(f\"{adminApiUrl}/admin/shop/order/{bigOrderId}/checklist\", headers=getAdminHeaders())\n",
    "assert r.status_code == 422, f\"status code should be 422 (actual: {r.status_code})\"\n",
    "\n",
    "data = r.json()\n",
    "assert data[\"nextAction\"] == \"SendScanRequest\", f\"nextAction should be SendScanRequest (actual: {data['nextAction']})\"\n",
    "\n",
    "r = requests.put(f\"{adminApiUrl}/admin/shop/order/{bigOrderId}\", headers=getAdminHeaders(), json={\"action\": \"SendScanRequest\"})\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "data = r.json()\n",
    "scanRequestId = data[\"scanRequestId\"]\n",
    "print(scanRequestId)\n",
    "\n",
    "# Get the scan request\n",
    "r = requests.get(f\"{adminApiUrl}/admin/fabricator/scan_request/{scanRequestId}\", headers=getAdminHeaders())\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "# Force topology update for the scan request\n",
    "r = requests.get(f\"{adminApiUrl}/admin/fabricator/scan_request/{scanRequestId}/topology/52308\", headers=getAdminHeaders())\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "# Verify the scan request\n",
    "r = requests.get(f\"{adminApiUrl}/admin/fabricator/scan_request/{scanRequestId}/verify\", headers=getAdminHeaders())\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "# run the checklist to get the nextAction\n",
    "r = requests.get(f\"{adminApiUrl}/admin/shop/order/{bigOrderId}/checklist\", headers=getAdminHeaders())\n",
    "assert r.status_code == 422, f\"status code should be 422 (actual: {r.status_code})\"\n",
    "data = r.json()\n",
    "assert data[\"nextAction\"] == \"CreateJob\", f\"nextAction should be CreateJob (actual: {data['nextAction']})\"\n",
    "\n",
    "# Pass 'CreateJob'\n",
    "r = requests.put(f\"{adminApiUrl}/admin/shop/order/{bigOrderId}\", headers=getAdminHeaders(), json={\"action\": \"CreateJob\"})\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "# Get the scan request\n",
    "r = requests.get(f\"{adminApiUrl}/admin/fabricator/scan_request/{scanRequestId}\", headers=getAdminHeaders())\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "data = r.json()\n",
    "jobId = data[\"jobIds\"][0]\n",
    "\n",
    "# Setup the external preprocessor payload\n",
    "payload = {\n",
    "    \"action\": JobActions.TryExternalPreprocessorUpload.value,\n",
    "    \"ipd\": 64,\n",
    "    \"left_pupil\": [0, 0],\n",
    "    \"right_pupil\": [0, 0],\n",
    "    \"mesh\": base64.b64encode(open(\"./teapot.stl\", \"rb\").read()).decode(\"utf-8\")\n",
    "}\n",
    "\n",
    "r = requests.put(f\"{adminApiUrl}/admin/fabricator/job/{jobId}\", headers=getAdminHeaders(), json=payload)\n",
    "assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code} {r.text})\"\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "accountIds = [\n",
    "];\n",
    "\n",
    "def deleteScanRequest(accountId):\n",
    "    # Get scan requests on account\n",
    "    r = requests.get(f\"{adminApiUrl}/admin/fabricator/account/{accountId}/scan_requests\", headers=getAdminHeaders())\n",
    "    assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "    data = r.json()\n",
    "    print(data)\n",
    "    scanRequests = data[\"items\"]\n",
    "    for scanRequest in scanRequests:\n",
    "        scanRequestId = scanRequest[\"id\"]\n",
    "        # Get the scan request\n",
    "        r = requests.get(f\"{adminApiUrl}/admin/fabricator/scan_request/{scanRequestId}\", headers=getAdminHeaders())\n",
    "        assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "        # Delete the scan request\n",
    "        r = requests.delete(f\"{adminApiUrl}/admin/fabricator/scan_request/{scanRequestId}\", headers=getAdminHeaders())\n",
    "        assert r.status_code == 200, f\"status code should be 200 (actual: {r.status_code})\"\n",
    "\n",
    "for accountId in accountIds:\n",
    "    deleteScanRequest(accountId)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
