import { BaseServiceOptions } from '../../api/services/base-service';
import { ProfileTypeEnum } from '../enums';
import {
  CreatePaymentRes,
  CreateSellerDocumentPayload,
  CreateSellerDocumentRes,
  CreateShippingAddressesRes,
  GetSellerProfileRes,
  SellerProfile, ShippingAddress, UserAddress
} from '../interfaces';
import { DocumentsService } from './documents.service';
import { WithDocumentsService } from './documents.service.interfaces';
import { PaymentDetailsService } from './payment-details.service';
import { WithPaymentDetails } from './payment-details.service.interfaces';
import { ProfileService } from './profile.service';
import { AddProfileRequest, EditProfileRequest } from './profile.service.interfaces';
import { ShippingAddressService } from './shipping-address.service';
import {
  ProfileAddShippingAddressRequest,
  EditShippingAddressRequest,
  WithShippingAddress,
} from './shipping-address.service.interfaces';

export type EditSellerProfileRequest = EditProfileRequest & Partial<SellerProfile>;
export type AddSellerProfileRequest = AddProfileRequest & Partial<SellerProfile>;

export class SellerProfileService
  extends ProfileService<SellerProfile>
  implements WithPaymentDetails, WithShippingAddress, WithDocumentsService {
  paymentDetails: PaymentDetailsService;
  shippingAddress: ShippingAddressService;
  documents: DocumentsService;

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

  getSellerProfileByUserId(userId: string) {
    return this.get<GetSellerProfileRes[]>(
      `${this.apiUrl}/users/v1/end-user/seller/list`,
      { userId: userId },
      { timeout: 5000 }
    );
  }

  getSellerDocuments(profileId: string) {
    return this.get<CreateSellerDocumentRes[]>(`${this.apiUrl}/users/v1/end-user/seller/${profileId}/documents/`);
  }

  addSellerDocument(req: CreateSellerDocumentPayload) {
    return this.post<CreateSellerDocumentRes, CreateSellerDocumentPayload>(
      `${this.apiUrl}/users/v1/end-user/seller/${req.profileId}/documents`,
      req
    );
  }

  updateSellerDocument(req: CreateSellerDocumentPayload) {
    return this.put<CreateSellerDocumentRes, CreateSellerDocumentPayload>(
      `${this.apiUrl}/users/v1/end-user/seller/${req.profileId}/documents/${req.docId}`,
      req
    );
  }

  getSellerAddress(profileId: string) {
    return this.get<ShippingAddress[]>(
      `${this.apiUrl}/users/v1/end-user/seller/${profileId}/shipping-addresses`
    );
  }
  async getSellerDefaultPaymentDetails(profileId: string) {
    return this.get<CreatePaymentRes>(
      `${this.apiUrl}/users/v1/end-user/seller/${profileId}/payment-details/default`,
      {},
      { timeout: 5000 }
    );
  }

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

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

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

  addSellerAddress(req: ProfileAddShippingAddressRequest) {
    return this.post<CreateShippingAddressesRes, ProfileAddShippingAddressRequest>(
      `${this.apiUrl}/users/v1/end-user/seller/${req.profileId}/shipping-addresses`,
      req
    );
  }

  editSellerAddress(req: EditShippingAddressRequest) {
    return this.put(
      `${this.apiUrl}/users/v1/end-user/seller/${req.profileId}/shipping-addresses/${req.addressId}`,
      req
    );
  }
}
