const swaggerAutogen = require("swagger-autogen")({ openapi: "3.0.0" });
const config = require("config");

const doc = {
  info: {
    title: config.get("app.name"),
    description: config.get("app.description"),
    version: config.get("app.version"),
  },
  servers: [
    {
      url: config.get("server.host_swagger"),
      description: "Environtment " + config.get("app.env"),
    },
  ],
  components: {
    schemas: {
      product: {
        $code: "123456",
        $name: "Product name",
        $description: "Product description",
        $source: "trialBalanceBranch / cifAccount / lnkolek",
        $status: "Y",
      },
      branch: {
        $code: "123456",
        $name: "Branch name",
        $status: "Y",
      },
      currency: {
        $name: "Dolar",
        $symbol: "$",
        $status: "Y",
      },
      inpatient_room: {
        $room_id: "34fdda87-9b42-44d3-8cab-2f2032481d42",
        $name: "Name",
        $number_of_bed: 1,
      },
      surgery_room: {
        $room_id: "34fdda87-9b42-44d3-8cab-2f2032481d42",
        $name: "Name",
      },
      surgery_type: {
        $name: "Elective",
      },
      menu: {
        $module: "Dashboard",
        $name: "Dashboard",
        $link: "/",
        $id_parent: "",
        $order_number: 1,
        $icon: "",
        $application: "ukln",
        $status: "Y",
      },
      administrativu: {
        $code: "123456",
        $name: "Administrativu name",
        $status: "Y",
        $munisipo_id: "uuid-string",
      },
      application: {
        $id: "ukln",
        $name: "Dashboard Performance Business",
        $reset_password_url: "https://brilianapps.britimorleste.tl/ukln/auth/reset-password/",
        $status: "Y",
      },
      aldeia: {
        $code: "123456",
        $name: "Aldeia name",
        $status: "Y",
        $suco_id: "uuid-string",
      },
      class_economi: {
        $code: "123456",
        $name: "Class economi name",
        $status: "Y",
      },
      district: {
        $code: "123456",
        $name: "District name",
        $status: "Y",
      },
      income_tier: {
        $code: "123456",
        $name: "Income tier name",
        $status: "Y",
      },
      munisipo: {
        $code: "123456",
        $name: "Munisipo name",
        $status: "Y",
      },
      suco: {
        $code: "123456",
        $name: "Suco name",
        $status: "Y",
        $administrativu_id: "uuid-string",
      },
      nationality: {
        $code: "123456",
        $name: "Nationality name",
        $status: "Y",
      },
      classEconomi: {
        $code: "123456",
        $name: "Class Economi name",
        $status: "Y",
      },
      incomeTier: {
        $code: "123456",
        $name: "Income Tier name",
        $status: "Y",
      },
      diagnosis: {
        $diagnosis: "Diagnosis name English (ICD-11)",
        $diagnosis_ind: "Diagnosis name Indonesian",
        $diagnosis_pt: "Diagnosis name Portuguese",
        $diagnosis_tet: "Diagnosis name Tetum",
        $code: "ABC123",
        $status: "Y",
      },
      diagnostic_procedure: {
        $diagnosticProcedure: "Procedure name (ICD-9)",
        $code: "XYZ789",
        $status: "Y",
      },
      room: {
        $room: "Room name",
        $code: "R001",
        $description: "Optional description",
        $department_id: "uuid-string",
        $serviceclass: "uuid-string",
        $status: "Y",
        $location: "Room location",
        $picture: "Room picture name",
        specialist_form: { "@enum": ["dental", "cardiology", "dermatology", "gynecology", "orthopedics", "neurology", "ear-nose-throat", "pulmonology", "urology"] },
      },
      room_number: {
        $number: "101",
        $department_id: "uuid-string",
      },
      laboratory: {
        $room: "Room name",
        $code: "R001",
        $description: "Optional description",
        $department_id: "uuid-string",
        $status: "Y",
      },
      // pharmacy: {
      //     $room: "Room name",
      //     $code: "R001",
      //     $description: "Optional description",
      //     $department_id: "uuid-string",
      //     $status: "Y"
      // },
      serviceType: {
        $name: "Registration & Tickets",
        $status: { "@enum": ["Y", "N"] },
      },
      serviceClass: {
        $name: "Class name",
      },
      service: {
        $name: "e.g. ER Registration",
        $service_type_id: "uuid-string",
        $status: { "@enum": ["Y", "N"] },
      },
      roomServices: {
        $service_type_ids: ["uuid-string"],
      },
      serviceFare: {
        $service_id: "uuid-string",
        $faretype: [
          {
            $faretype_id: "uuid-string",
            $service_class: [
              {
                $service_class_id: "uuid-string",
                $fare: 100000,
              },
            ],
          },
        ],
      },
      servicePackage: {
        $name: "Package name",
        $service_class_id: "uuid-string",
        $fare: 500000,
        $service_ids: ["uuid-string"],
      },
      department: {
        $name: "igd",
        $status: { "@enum": ["Y", "N"] },
      },
      doctorSchedule: {
        $day: "Senin",
        $start_time: "08:00",
        $end_time: "12:00",
        $doctor_id: "uuid-string",
        $room_id: "uuid-string",
        $quota: "20",
        $status: { "@enum": ["Y", "N"] },
      },
      doctorItem: {
        $doctor_id: "uuid-string",
        $item_master_id: "uuid-string",
      },
      doctorItemPackage: {
        $doctor_id: "uuid-string",
        $name: "Paket Obat Harian",
        $description: "Optional description",
        $item_master_ids: ["uuid-string"],
        $active: true,
      },
      measurementUnit: {
        $unit: "Milligram",
        $status: { "@enum": ["Y", "N"] },
      },
      medical_form: {
        $title: "Form title",
        $name: "Form name",
        $description: "Form description",
        picture: "Form picture path",
        $status: "Y",
      },
      referenceRange: {
        $gender: { "@enum": ["male", "female"] },
        $age_range_min: "0 | (days)",
        $age_range_max: "20 | (days)",
        $value_min: "13.7",
        $value_max: "17.5",
        $status: { "@enum": ["Y", "N"] },
      },
      queueMonitoring: {
        $name: "Ground Floor Queue",
        $slug: "ground-floor-queue",
        $room_ids: ["uuid-string"],
        $status: { "@enum": ["Y", "N"] },
      },
      examinationType: {
        $name: "Examination Type name",
        $status: { "@enum": ["Y", "N"] },
        $service_ids: ["uuid-string"],
      },
      examinationDetail: {
        $name: "Examination Detail name",
        $order_no: "Order number",
        $measurement_unit_id: "uuid-string",
        $reference_range_ids: "[] array uuid-string",
        $status: { "@enum": ["Y", "N"] },
      },
      serviceExamination: {
        $examination_detail_ids: ["uuid-string"],
      },
      serviceExaminationCreate: {
        $examination_detail_ids: ["uuid-string"],
        $service_id: "uuid-string",
      },
      hospitalinformation: {
        $name: "Hospital Name",
        $address: "Hospital Address",
        $phone: "Hospital Phone",
        $logo: "Hospital Logo",
        // $province: "province code",
        // $city: "city code",
        // $subdistrict: "subdistrict code",
        // $ward: "ward code",
        $munisipo: "Munisipo ID",
        $administrativu: "Administrativu ID",
        $aldeia: "Aldeia ID",
        $suco: "Suco ID",
      },
      files: {
        $file_name: "File Name",
      },
      item_group: {
        $group_name: "ItemGroup name",
      },
      item_origin: {
        $origin_name: "ItemOrigin name",
        $origin_description: "ItemOrigin Desc",
        $department: "Department name",
        $account: "Account name",
      },
      item_type: {
        $type_name: "ItemType name",
        $item_group_id: "ItemGroup Id",
      },
      item_type_detail: {
        $type_detail_name: "ItemTypeDetail name",
        $item_type_id: "ItemType Id",
      },
      unit: {
        $unit_name: "Unit name",
        $small_unit: "Small unit name",
        $large_unit: "Large unit name",
      },
      item_category: {
        $category_name: "ItemCategory name",
      },
      item_status: {
        $status_name: "Itemstatus name",
      },
      item_class: {
        $item_class_name: "ItemClass name",
      },
      item_class_detail: {
        $class_detail_name: "ItemClassDetail name",
      },
      usage_instructions: {
        $usage_instructions_name: "UsageInstructions name",
        $usage_instructions_abbreviation: "UsageInstructions Abbreviation",
      },
      usage_time: {
        $usage_time_name: "UsageInstructions name",
        $usage_time_abbreviation: "UsageInstructions Abbreviation",
      },
      generic_name: {
        $generic_name: "Generic name",
      },
      factory: {
        $factory_name: "factory name",
        $address: "Factory address",
        $web: "Factory url web",
        $phone: "Factory phone",
        $email: "Factory email",
      },
      supplier: {
        $supplier_name: "supplier name",
        $address: "supplier address",
        $phone: "supplier phone",
        $email: "supplier email",
      },
      factory_to_supplier: {
        $supplier_id: "Supplier ID (required, UUID)",
        $factory_ids: "Array [factory-uuid-1, factory-uuid-2]",
      },
      item_master: {
        $item_name: "Item name",
        $generic_name_id: "Generic name ID (UUID)",
        $item_type_detail_id: "Item type detail ID (UUID)",
        $item_category_id: "Item category ID (UUID)",
        $item_class_id: "Item class ID (UUID)",
        $item_class_detail_id: "Item class Detail ID (UUID)",
        $item_status_id: "Item status ID (UUID)",
        $factory_id: "Factory ID (UUID)",
        // $unit_id: "Unit ID (UUID)",
        $smallunit: "string",
        $largeunit: "string",
        $pack_size: "Pack size (integer, minimum 0)",
        $minimum_quantity: "Minimum quantity (integer, minimum 0)",
        $minimum_sales_quantity: "Minimum sales quantity (integer, minimum 0)",
        $strength: "Strength value (number, minimum 0)",
        $active: "Active status (boolean)",
      },
      pharmacy_info: {
        $logo: "Logo (string, max 256)",
        $name: "Name (string, max 256)",
        $address: "Address (string, max 500)",
        $munisipiu: "Munisipiu ID (UUID)",
        $postu_admin: "Postu Admin ID (UUID)",
        $suco: "Suco ID (UUID)",
        $aldeia: "Aldeia ID (UUID)",
        $phone: "Phone (string, max 30, optional)",
        $default_room_id: "Default Room ID (UUID)",
        // $province: "Province Code",
        // $city: "City Code",
        // $subdistrict: "Subdistrict Code",
        // $ward: "Ward Code",
      },
      item_price: {
        $item_master_id: "Item Master ID (required, UUID)",
        $purchase_price: "Purchase Price (required, number, minimum 0)",
        $selling_price: "Selling Price (required, number, minimum 0)",
      },
      initial_stock: {
        $itemmaster: "Item Master uuid",
        $room: "Room uuid",
        $itemorigin: "Item Origin uuid",
        $batch: "Batch",
        $exp_date: "Exp Date",
        $stock: "Stock",
      },
      selling_price_percentage: {
        $item_master_id: "Item Master ID (required, UUID)",
        $item_origin_id: "Item Origin ID (required, UUID)",
        $percentage: "Percentage (required, number, min 0, max 999.99, 2 decimal places)",
      },
      patient_group: {
        $patient_group_name: "PatientGroup name",
      },
      patient_guarantor: {
        $guarantor_name: "PatientGuarantor name",
        $phone: "08123456789", // Nomor telepon
        // $province: "West Java", // Provinsi
        // $city: "Bandung", // Kota
        $munisipo: "2e1a1b33-bbb2-4f33-b2c4-cff5976f3f95", // Munisipo (UUID)
        $administrativu: "2e1a1b33-bbb2-4f33-b2c4-cff5976f3f95", // Administrativu (UUID)
        $aldeia: "2e1a1b33-bbb2-4f33-b2c4-cff5976f3f95", // Aldeia (UUID)
        $suco: "2e1a1b33-bbb2-4f33-b2c4-cff5976f3f95", // Suco (UUID)
        // $zip_code: "40123", // Kode Pos
        $agreement_no: "AG123456789", // Nomor Perjanjian
        $agreement_desc: "Health Insurance Agreement", // Deskripsi Perjanjian (opsional)
        $patient_group_id: "2e1a1b33-bbb2-4f33-b2c4-cff5976f3f95", // Patient Group (UUID)
        $faretype: "3f1a1b33-bbb2-4f33-b2c4-cff5976f3f95", // Fare Type (UUID)
        $maximalliability: 1000000, // Maximal Liability (opsional)
        is_default: false, // Is Default (opsional)
        is_full_paid: false, // Is Full Paid (opsional)
      },
      refferal_hospital: {
        $refferal_hospital_name: "RefferalHospital name",
      },
      user_to_room: {
        $user_id: "user ID (required, UUID)",
        $room_id: "Room ID (required, UUID)",
      },
      user_to_room_update: {
        $user_id: "user ID (required, UUID)",
        $room_ids: "Array [room-uuid-1, room-uuid-2]",
      },
      room_to_pharmacy: {
        $room_id: "room ID (required, UUID)",
        $pharmacy_room_id: "Pharmacy Room ID (required, UUID)",
      },
      planning_verificator: {
        $user_id: "User ID (required, UUID)",
      },
      scheduleRecurrence: {
        $type: { "@enum": ["daily", "weekly", "monthly"] },
        $interval: 1,
        $daysOfWeek: ["MO", "WE", "FR"],
      },
      scheduleSeriesCreate: {
        $roomId: "uuid-string",
        $doctorId: "uuid-string",
        $title: "Practice Schedule",
        $quota: 20,
        $startDate: "2026-03-20",
        $untilDate: "2026-06-30",
        $startTime: "09:00:00",
        $endTime: "12:00:00",
        $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" },
      },
      scheduleSeriesUpdate: {
        $roomId: "uuid-string",
        $doctorId: "uuid-string",
        $title: "Practice Schedule Updated",
        $quota: 25,
        $startDate: "2026-03-20",
        $untilDate: "2026-07-31",
        $startTime: "10:00:00",
        $endTime: "13:00:00",
        $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" },
      },
      scheduleSeriesDetail: {
        $id: "uuid-string",
        $room_id: "uuid-string",
        $doctor_id: "uuid-string",
        $title: "Practice Schedule",
        $quota: 20,
        $start_date: "2026-03-20",
        $until_date: "2026-06-30",
        $start_time: "09:00:00",
        $end_time: "12:00:00",
        $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" },
        $status: "Active",
        $room: { id: "uuid-string", room: "Room 1" },
        $doctor: { id: "uuid-string", name: "Dr A" },
      },
      scheduleExceptionCreate: {
        $occurrenceDate: "2026-03-24",
        $isCancelled: false,
        $overrideRoomId: "uuid-string",
        $overrideDoctorId: "uuid-string",
        $overrideTitle: "Override Practice",
        $overrideStartAt: "2026-03-24T10:00:00.000Z",
        $overrideEndAt: "2026-03-24T12:30:00.000Z",
      },
      scheduleCalendarResource: {
        $id: "room-1:doctor-1",
        $roomId: "room-1",
        $roomName: "Room 1",
        $doctorId: "doctor-1",
        $doctorName: "Dr A",
      },
      scheduleCalendarEvent: {
        $id: "occ:series-101:2026-03-20",
        $seriesId: "series-101",
        $resourceId: "room-1:doctor-1",
        $title: "Practice",
        $startAt: "2026-03-20T09:00:00+07:00",
        $endAt: "2026-03-20T12:00:00+07:00",
        $quota: 20,
        $usedQuota: 7,
        $leftQuota: 13,
        $isRecurring: true,
        $isException: false,
        $status: "confirmed",
      },
      scheduleCalendarMeta: {
        $total_count: 24,
        $page: 1,
        $limit: 20,
      },
      faretype: {
        $name: "Name (string)",
      },
      card_type: {
        $name: "Name (string)",
      },
      card_key_set: {
        $key_set_id: "Key Set ID (string)",
        app_master_key: "App Master Key (string, optional)",
        read_basic_key: "Read Basic Key (string, optional)",
        write_update_key: "Write Update Key (string, optional)",
        read_sensitive_key: "Read Sensitive Key (string, optional)",
      },
      payment_method: {
        $name: "Name (string)",
      },
      registration_fee: {
        type: "emergency | outpatient",
        service: ["uuid-string-1", "uuid-string-2"],
      },
      serviceFareUpdate: {
        $fare: 100000,
      },
      responsiblepartyconsent: {
        $bodytext: "string",
        $type: "responsible-party-consent | patient-education | inpatient-admission-consent | provision-of-information | ward-class-upgrade-entitlement",
      },
      fostercarehistory: {
        type: "object",
        properties: {
          diagnosis: {
            type: "string",
            maxLength: 256,
            example: "Gangguan Pertukaran Gas"
          },
          code: {
            type: "string",
            maxLength: 128,
            example: "D.0003"
          },
          status: {
            type: "string",
            example: "active"
          },
          category: {
            type: "string",
            maxLength: 128,
            nullable: true,
            example: "Fisiologis"
          },
          subcategory: {
            type: "string",
            maxLength: 128,
            nullable: true,
            example: "Respirasi"
          },
          definition: {
            type: "string",
            maxLength: 128,
            nullable: true,
            example: "Kelebihan atau kekurangan oksigenasi"
          },
          objective: {
            type: "string",
            maxLength: 128,
            nullable: true,
            example: "Meningkatkan pertukaran gas"
          },
          result_criteria: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                group: { type: "number", example: 1 },
                name: { type: "string", example: "Saturasi oksigen membaik" }
              }
            }
          },
          causes: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                group: { type: "string", example: "Fisiologis" },
                name: { type: "string", example: "Ketidakseimbangan ventilasi-perfusi" }
              }
            }
          },
          related_clinical_condition: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                name: { type: "string", example: "Penyakit Paru Obstruktif Kronis (PPOK)" }
              }
            }
          },
          subjective_major: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                group: { type: "string", example: "Mayor" },
                name: { type: "string", example: "Dispnea" }
              }
            }
          },
          objectitve_major: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                group: { type: "string", example: "Mayor" },
                name: { type: "string", example: "PCO2 meningkat/menurun" }
              }
            }
          },
          subjective_minor: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                group: { type: "string", example: "Minor" },
                name: { type: "string", example: "Pusing" }
              }
            }
          },
          objective_minor: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                group: { type: "string", example: "Minor" },
                name: { type: "string", example: "Napas cuping hidung" }
              }
            }
          },
          observation: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                name: { type: "string", example: "Monitor frekuensi, irama, kedalaman napas" }
              }
            }
          },
          therapeutic: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                name: { type: "string", example: "Berikan posisi semi-Fowler" }
              }
            }
          },
          education: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                name: { type: "string", example: "Anjurkan teknik batuk efektif" }
              }
            }
          },
          colaboration: {
            type: "array",
            nullable: true,
            items: {
              type: "object",
              properties: {
                name: { type: "string", example: "Kolaborasi pemberian bronkodilator" }
              }
            }
          },
        }
      },
    },
    parameters: {},
    securitySchemes: {
      bearerAuth: {
        type: "http",
        scheme: "bearer",
      },
    },
  },
};

const outputFile = "./swagger.json";
const routes = ["../routes/private.ts", "../routes/public.ts"];

swaggerAutogen(outputFile, routes, doc);
