import { BaseServiceOptions } from '../../api/services/base-service';
import { ProfileTypeEnum } from '../enums';
import { BuyerProfile, CreatePaymentRes, CreateShippingAddressesRes } from '../interfaces';
import { PaymentDetailsService } from './payment-details.service';
import { WithPaymentDetails } from './payment-details.service.interfaces';
import { ProfileService } from './profile.service';
import { AddProfileRequest, AddShippingAddressRequest, EditProfileRequest } from './profile.service.interfaces';
import { CreateBuyerProfilePayload, CreatePaymentPayload, GetBuyerProfileRes } from '../interfaces';
import { ShippingAddressService } from './shipping-address.service';
import { WithShippingAddress } from './shipping-address.service.interfaces';

type EditBuyerProfileRequest = EditProfileRequest;
type AddBuyerProfileRequest = AddProfileRequest;

export class BuyerProfileService
  extends ProfileService<BuyerProfile>
  implements WithPaymentDetails, WithShippingAddress
{
  paymentDetails: PaymentDetailsService;
  shippingAddress: ShippingAddressService;

  constructor(opts: BaseServiceOptions) {
    super({ ...opts, profileType: ProfileTypeEnum.Buyer });
    this.paymentDetails = new PaymentDetailsService({ ...opts, profileApiUrl: this.profileApiUrl });
    this.shippingAddress = new ShippingAddressService({ ...opts, profileApiUrl: this.profileApiUrl });
  }

  editProfile(id: string, req: EditBuyerProfileRequest) {
    return this.put<BuyerProfile, EditBuyerProfileRequest>(`${this.profileApiUrl}/${id}`, req);
  }

  addProfile(req: AddBuyerProfileRequest) {
    return this.post<BuyerProfile, AddBuyerProfileRequest>(this.profileApiUrl, req);
  }

  getBuyerProfile() {
    return this.get<GetBuyerProfileRes>(`${this.apiUrl}/users/v1/end-user/buyer/default`, {}, { timeout: 5000 });
  }

  getBuyerProfilebyId(buyerId: string) {
    return this.get<GetBuyerProfileRes>(`${this.apiUrl}/users/v1/end-user/buyer/${buyerId}`, {}, { timeout: 5000 });
  }

  getBuyerAddresses(profileId: string) {
    return this.get<CreateShippingAddressesRes[]>(
      `${this.apiUrl}/users/v1/end-user/buyer/${profileId}/shipping-addresses`,
      {},
      { timeout: 5000 }
    );
  }

  getBuyerPaymentDetails(profileId: string) {
    return this.get<CreatePaymentRes[]>(
      `${this.apiUrl}/users/v1/end-user/buyer/${profileId}/payment-details`,
      {},
      { timeout: 5000 }
    );
  }

  createBuyerProfile(payload: CreateBuyerProfilePayload) {
    return this.post<GetBuyerProfileRes, CreateBuyerProfilePayload>(`${this.apiUrl}/users/v1/end-user/buyer`, payload, {
      timeout: 5000,
    });
  }
  updateBuyerProfile(payload: CreateBuyerProfilePayload) {
    return this.patch<GetBuyerProfileRes, CreateBuyerProfilePayload>(`${this.apiUrl}/users/v1/end-user/buyer`, payload);
  }
  addBuyerAddress(payload: AddShippingAddressRequest) {
    return this.post<CreateShippingAddressesRes, AddShippingAddressRequest>(
      `${this.apiUrl}/users/v1/end-user/buyer/${payload.profileId}/shipping-addresses`,
      payload,
      { timeout: 5000 }
    );
  }
  addBuyerPaymentDetails(payload: CreatePaymentPayload) {
    return this.post<CreatePaymentRes, CreatePaymentPayload>(
      `${this.apiUrl}/users/v1/end-user/buyer/${payload.profileId}/payment-details`,
      payload,
      { timeout: 5000 }
    );
  }

  updateBuyerAddress(payload: AddShippingAddressRequest) {
    return this.put<CreateShippingAddressesRes, AddShippingAddressRequest>(
      `${this.apiUrl}/users/v1/end-user/buyer/${payload.profileId}/shipping-addresses/${payload.addressId}`,
      payload,
      { timeout: 5000 }
    );
  }

  deleteBuyerAddress(payload: { profileId: string; addressId: string }) {
    return this.delete(
      `${this.apiUrl}/users/v1/end-user/buyer/${payload.profileId}/shipping-addresses/${payload.addressId}`
    );
  }

  updateBuyerPaymentDetails(payload: any) {
    return this.put<CreatePaymentRes, CreatePaymentPayload>(
      `${this.apiUrl}/users/v1/end-user/buyer/${payload.profileId}/payment-details/${payload.id}`,
      payload,
      { timeout: 5000 }
    );
  }

  deleteBuyerPaymentDetails(payload: any) {
    return this.delete(`${this.apiUrl}/users/v1/end-user/buyer/${payload.profileId}/payment-details/${payload.id}`);
  }
}
