import axios, { AxiosError } from "axios";

const CLASSWISE_API_URL = process.env.NEXT_PUBLIC_CLASSWISE_API_URL || "https://backend.classwise.youngengineers.org/api/v3";
const CLASSWISE_TOKEN = process.env.CLASSWISE_TOKEN || "";

export interface CouponData {
  valid: boolean;
  group_id: number;
  coupon_code: string;
  discount: number;
  discount_type: "percentage" | "fixed";
}

export interface CouponResponse {
  status: string;
  message: string;
  error_type: string;
  data: CouponData;
}

// Separate axios instance for Classwise Coupon API
const couponApiClient = axios.create({
  baseURL: CLASSWISE_API_URL,
  timeout: 10000,
  headers: {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": CLASSWISE_TOKEN,
  },
});

export class CouponService {
  async verifyCoupon(couponCode: string, groupId: number): Promise<CouponResponse> {
    const startTime = Date.now();

    try {
      if (!couponCode || !groupId) {
        throw new Error("Coupon code and group ID are required");
      }


      const response = await couponApiClient.get<CouponResponse>(
        "/verify-group-coupon",
        {
          params: {
            coupon_code: couponCode.trim().toUpperCase(),
            group_id: groupId,
          },
        }
      );

      const elapsed = Date.now() - startTime;

      if (!response.data?.status) {
        return {
          status: "error",
          message: "Invalid response from server",
          error_type: "invalid_response",
          data: {
            valid: false,
            group_id: groupId,
            coupon_code: couponCode,
            discount: 0,
            discount_type: "percentage",
          },
        };
      }

      if (response.data.status === "success" && response.data.data?.valid) {
        return response.data;
      } else {
        return response.data;
      }
    } catch (error) {
      const elapsed = Date.now() - startTime;
      
      if (error instanceof AxiosError) {
        console.error(
          `[CouponService] ✗ Failed to verify coupon in ${elapsed}ms:`,
          {
            message: error.message,
            status: error.response?.status,
            data: error.response?.data,
          }
        );

        // Handle specific error cases
        if (error.response?.status === 401) {
          return {
            status: "error",
            message: "Authentication failed. Invalid token.",
            error_type: "auth_error",
            data: {
              valid: false,
              group_id: groupId,
              coupon_code: couponCode,
              discount: 0,
              discount_type: "percentage",
            },
          };
        }

        if (error.response?.status === 404) {
          return {
            status: "error",
            message: "Coupon not found or does not belong to this group",
            error_type: "not_found",
            data: {
              valid: false,
              group_id: groupId,
              coupon_code: couponCode,
              discount: 0,
              discount_type: "percentage",
            },
          };
        }

        // Return backend error message if available
        if (error.response?.data?.message) {
          return {
            status: "error",
            message: error.response.data.message,
            error_type: error.response.data.error_type || "validation_error",
            data: {
              valid: false,
              group_id: groupId,
              coupon_code: couponCode,
              discount: 0,
              discount_type: "percentage",
            },
          };
        }
      }

      // Generic error fallback
      console.error(`[CouponService] ✗ Unexpected error in ${elapsed}ms:`, error);
      return {
        status: "error",
        message: "Failed to verify coupon. Please try again.",
        error_type: "server_error",
        data: {
          valid: false,
          group_id: groupId,
          coupon_code: couponCode,
          discount: 0,
          discount_type: "percentage",
        },
      };
    }
  }
}

export const couponService = new CouponService();
