"use server";
import axios from "axios";
import { ZodFormattedError } from "zod";
import { addressSchema, AddressSchemaType } from "../validations/authSchema";

// Define common response type
interface AddressResponse {
  success: boolean;
  message?: string;
  errors?: ZodFormattedError<AddressSchemaType>;
  data?: any;
}

export async function fetchAddresses(token: string): Promise<AddressResponse> {
  try {
    const response = await axios.get(
      `${process.env.NEXT_PUBLIC_API_URL}/address/index`,
      {
        headers: {
          Authorization: `Bearer ${token}`,
          "Accept-Language": "en",
          "Content-Type": "application/json",
          Accept: "application/json",
        },
      }
    );
    if (response?.data && response?.data?.success_type === "ADDRESS_INDEX") {
      return { success: true, data: response?.data?.addressData };
    } else {
      return { success: false, message: "Failed to fetch addresses" };
    }
  } catch (error: any) {
    throw error;
  }
}

export async function addAddress(
  addressData: any,
  token: string
): Promise<AddressResponse> {
  try {
    const response = await axios.post(
      `${process.env.NEXT_PUBLIC_API_URL}/address/store`,
      addressData,
      {
        headers: {
          Authorization: `Bearer ${token}`,
          "Accept-Language": "en",
          "Content-Type": "application/json",
          Accept: "application/json",
        },
      }
    );
    if (response?.data && response?.data?.success_type === "ADDRESS_STORE") {
      return {
        success: true,
        data: response?.data?.addressData,
        message: "Address added successfully",
      };
    } else {
      return { success: false, message: "Failed to add address" };
    }
  } catch (error: any) {
    throw error;
  }
}

export async function updateAddress(
  addressId: string,
  addressData: any,
  token: string
): Promise<AddressResponse> {
  try {
    const response = await axios.put(
      `${process.env.NEXT_PUBLIC_API_URL}/address/update/${addressId}`,
      addressData,
      {
        headers: {
          Authorization: `Bearer ${token}`,
          "Accept-Language": "en",
          "Content-Type": "application/json",
          Accept: "application/json",
        },
      }
    );
    if (response?.data && response?.data?.success_type === "ADDRESS_UPDATE") {
      return {
        success: true,
        data: response?.data?.addressData,
        message: "Address updated successfully",
      };
    } else {
      return { success: false, message: "Failed to update address" };
    }
  } catch (error: any) {
    throw error;
  }
}

export async function deleteAddress(
  addressId: string,
  token: string
): Promise<AddressResponse> {
  try {
    const response = await axios.delete(
      `${process.env.NEXT_PUBLIC_API_URL}/address/${addressId}/delete`,
      {
        headers: {
          Authorization: `Bearer ${token}`,
          "Accept-Language": "en",
          "Content-Type": "application/json",
          Accept: "application/json",
        },
      }
    );
    if (response?.data?.success_type === "ADDRESS_DELETE") {
      return { success: true, message: "Address deleted successfully" };
    }
    return { success: false, message: "Failed to delete address" };
  } catch (error: any) {
    throw error;
  }
}


