import { XMLParser } from "fast-xml-parser";
import { RCIClient } from "../lib/client";
import type {
  ReservationGuest,
  ReservationResponse,
  ResponseHeader,
} from "../type";

export class RCIBookingTravellers {
  private client: <TResponse>(init?: RequestInit) => Promise<TResponse | null>;
  constructor() {
    const baseURL = process.env.RCI_TRX_URL!;
    if (!baseURL) {
      throw new Error("Missing RCI Transaction URL");
    }
    this.client = RCIClient(baseURL);
  }

  async addTraveller(
    credentials: {
      username: string;
      password: string;
    },
    payload: {
      inventoryType: string;
      referenceNumber: string;
      guest: ReservationGuest;
    },
  ) {
    try {
      const body = `
        <requestEnvelope>
	<requestHeader>
		<controlData>
			<clientName>XMLBusinessPartnerChannel</clientName>
			<userID>${credentials.username}</userID>
			<password>${credentials.password}</password>
		</controlData>
		<processData>
			<operationName>addTraveler</operationName>
		</processData>
	</requestHeader>
     	<AddTravelerRequest>
      		<reservationToken>
     			<inventoryType>${payload.inventoryType}</inventoryType>
     			<referenceNumber>${payload.referenceNumber}</referenceNumber>
      		</reservationToken>
      		<travelerInfo>
     			<firstName>${payload.guest.firstName}</firstName>
     			<middleName></middleName>
     			<lastName>${payload.guest.lastName}</lastName>
     			<addressline1>${payload.guest.addressLine1.slice(0, 25)}</addressline1>
     			<addressline2>${payload.guest.addressLine2.slice(0, 25)}</addressline2>
     			<addressline3>${payload.guest.addressLine3.slice(0, 25)}</addressline3>
     			<city>${payload.guest.city}</city>
     			<state>${payload.guest.state}</state>
     			<country>${payload.guest.country}</country>
     			<zipCode>${payload.guest.zipcode}</zipCode>
     			<homePhone>${payload.guest.phone}</homePhone>
     			<workPhone>${payload.guest.phone}</workPhone>
     			<email>${payload.guest.email}</email>
      		</travelerInfo>
     	</AddTravelerRequest>
        </requestEnvelope>
        `;

      const response = await this.client<string>({
        method: "POST",
        body,
      });
      if (!response) {
        return null;
      }
      const parser = new XMLParser();
      const parsedResponse = parser.parse(response) as {
        responseEnvelope: {
          responseHeader: ResponseHeader;
          ReservationResponse: ReservationResponse;
        };
      };
      return parsedResponse;
    } catch (err) {
      throw err instanceof Error ? err : new Error(String(err));
    }
  }
}
