import { create } from "zustand";
import { RepositoryRemote } from "../services";
import { alerts } from "../utils/alerts";

const initialState = {
  cartInfo: localStorage.getItem("cartInfo")
    ? JSON.parse(localStorage.getItem("cartInfo") || "")
    : {
        line_items: [],
        total_after_discount: 0,
        total_before_discount: 0,
        product_discount_amount: 0,
        voucherStatus: 0,
      },
  shipmentFee: [],
  paymentMethod: [],
  isUseDiscountPrice: {
    is_use_points: false,
    is_use_balance_collaborator: false,
    is_use_balance_agency: false,
  },
  customerInfo: {
    customer_address_id: "",
    customer_note: "",
  },
  shipmentInfo: {
    name: "",
    description: "",
    ship_speed_code: "",
    partner_id: "",
    fee: 0,
  },
  paymentInfo: {
    id: "",
    name: "",
    payment_method_id: "",
  },
  defaultAddress: {},
  codeVoucher: "",
  order_code: "",
};

export const useCartStore = create((set, get) => ({
  ...initialState,
  loading: false,
  loadingCart: false,
  loadingPaymentMethod: false,
  loadingShipmentFee: false,
  loadingOrder: false,
  loadingAddToCart: false,
  setDefaultAddress: (newDefaultAddress) => {
    const state = get();
    set({
      defaultAddress: {
        ...state.defaultAddress,
        ...newDefaultAddress,
      },
    });
  },
  setShipmentInfo: (newShipmentInfo) => {
    const state = get();
    set({
      shipmentInfo: {
        ...state.shipmentInfo,
        ...newShipmentInfo,
      },
    });
  },
  setPaymentInfo: (newPaymentInfo) => {
    const state = get();
    set({
      paymentInfo: {
        ...state.paymentInfo,
        ...newPaymentInfo,
      },
    });
  },
  setIsUseDiscountPrice: (isUseDiscount) => {
    const state = get();
    set({
      isUseDiscountPrice: { ...state.isUseDiscountPrice, ...isUseDiscount },
    });
  },
  setCustomerInfo: (customer) => {
    const state = get();
    set({
      customerInfo: { ...state.customerInfo, ...customer },
    });
  },
  setCodeVoucher: (codeVoucher) => {
    set({
      codeVoucher: codeVoucher,
    });
  },
  setOrderCode: (orderCode) => {
    set({
      order_code: orderCode,
    });
  },
  resetShipmentInfo: () => {
    set({
      shipmentInfo: {
        name: "",
        description: "",
        ship_speed_code: "",
        partner_id: "",
        fee: 0,
      },
    });
  },
  orderSuccess: () => {
    localStorage.removeItem("cartInfo");
    localStorage.removeItem("total_shipping_fee");
    set(initialState);
  },
  getCart: async (info = {}, onSuccess = () => {}) => {
    try {
      set({ loadingCart: true });
      const state = get();

      const data = {
        ...state.isUseDiscountPrice,
        code_voucher: state.codeVoucher,
        ...info,
      };
      const response = await RepositoryRemote.cart.applyDiscount(data);
      localStorage.setItem("cartInfo", JSON.stringify(response.data.data));

      if (info.total_shipping_fee) {
        localStorage.setItem(
          "total_shipping_fee",
          JSON.stringify(info.total_shipping_fee)
        );
      }

      set({ cartInfo: response.data.data });

      if (onSuccess) onSuccess();
    } catch (error) {
      alerts.error(error.response.data.msg);
    }
    set({ loadingCart: false });
  },
  getPaymentMethods: async (onSuccess = () => {}) => {
    try {
      set({ loadingPaymentMethod: true });
      const response = await RepositoryRemote.cart.getPaymentMethods();

      set({ paymentMethod: response.data.data });

      if (onSuccess) onSuccess();
    } catch (error) {
      alerts.error(msgCode);
    }
    set({ loadingPaymentMethod: false });
  },
  changeQuantityInCart: async (
    product,
    defaultAddress,
    onSuccess = () => {}
  ) => {
    try {
      set({ loading: true });
      const response = await RepositoryRemote.cart.changeQuantityInCart(
        product
      );

      localStorage.setItem("cartInfo", JSON.stringify(response.data));
      if (product.quantity === 0) {
        alerts.success("Xóa sản phẩm khỏi giỏ hàng thành công !");
      }
      const state = get();
      state.applyDiscount();
      if (Object.entries(defaultAddress).length > 0) {
        state.postListShipperFee(defaultAddress?.id);
      }

      onSuccess();
    } catch (error) {
      const msgCode = error.response.data.msg;
      if (
        msgCode === "NOT_ENOUGH_USE_VOUCHER" ||
        msgCode === "NO_VOUCHER_EXISTS"
      ) {
        localStorage.removeItem("code_voucher");
      }
      alerts.error(msgCode);
    }
    set({ loading: false });
  },
  applyDiscount: async (info = {}, onSuccess = () => {}) => {
    try {
      set({ loadingShipmentFee: true });
      const state = get();

      const data = {
        ...state.isUseDiscountPrice,
        code_voucher: state.codeVoucher,
        ...info,
      };
      const response = await RepositoryRemote.cart.applyDiscount(data);
      localStorage.setItem("cartInfo", JSON.stringify(response.data.data));

      if (info.total_shipping_fee) {
        localStorage.setItem(
          "total_shipping_fee",
          JSON.stringify(info.total_shipping_fee)
        );
      }

      set({ cartInfo: response.data.data });

      if (onSuccess) onSuccess();
    } catch (error) {
      alerts.error(error.response.data.msg);
    }
    set({ loadingShipmentFee: false });
  },
  postListShipperFee: async (idAddress, dataAddress, onSuccess = () => {}) => {
    try {
      set({ loading: true });
      const response = await RepositoryRemote.cart.postListShipperFee(
        idAddress,
        dataAddress
      );

      const data = [];
      for (var element of response.data.data) {
        const resService =
          await RepositoryRemote.cart.postShipmentFeeForEachService(
            idAddress,
            dataAddress,
            element.partner_id
          );
        if (resService?.data?.data?.fee_with_type_ship?.length > 0) {
          data.push(resService.data.data);
        }

        set({ shipmentFee: data });
      }

      onSuccess();
    } catch (error) {
      alerts.error(error.response.data.msg);
    }
    set({ loading: false });
  },
  orderCart: async (data, onSuccess = () => {}) => {
    try {
      set({ loadingOrder: true });
      const response = await RepositoryRemote.cart.orderCart(data);
      set({ order_code: response.data.data.order_code });
      if (onSuccess) onSuccess();
    } catch (error) {
      alerts.error(error.response.data.msg);
    }
    set({ loadingOrder: false });
  },
  addCart: async (data, onSuccess = () => {}) => {
    try {
      set({ loadingAddToCart: true });
      const response = await RepositoryRemote.cart.addCart(data);
      set({ cartInfo: response.data.data });
      localStorage.setItem("cartInfo", JSON.stringify(response.data.data));
      if (onSuccess) onSuccess();
    } catch (error) {
      alerts.error(error.response.data.msg);
    }
    set({ loadingAddToCart: false });
  },
}));
