import { coloredToast } from '@/lib/toast';

interface Coupon {
    coupon_name: string;
    coupon_title: string;
    coupon_type: string;
    coupon_description: string;
    coupon_amount: number;
    coupon_start_date: Date;
    coupon_end_date: Date;
    coupon_is_individual: boolean;
    coupon_is_limited: boolean;
    coupon_limit: number;
    coupon_categories: string[];
    include_product_categories: string[];
    exclude_product_categories: string[];
    excluded_products: string[];
    included_products: string[];
    coupon_min_purchase: number;
    coupon_is_max_disc: boolean;
    coupon_max_amount_disc: number;
    coupon_free_item_name: string;
    coupon_free_item_products?: string[];
    coupon_is_unique_user: boolean;
    coupon_is_noticed: boolean;
    coupon_notice_desc: string;
    coupon_is_highlight: boolean;
    coupon_is_public: boolean;
}

export const SaveCoupon = (couponForm: Coupon) => {
    const validationError = validateInput(couponForm);

    if (validationError) {
        coloredToast('warning', validationError);
        return { status: false };
    }

    const freeItemProducts = Array.isArray(couponForm.coupon_free_item_products)
        ? couponForm.coupon_free_item_products.filter(Boolean)
        : [];

    const data = {
        coupon_name: String(couponForm.coupon_name || '').toUpperCase(),
        coupon_title: couponForm.coupon_title,
        coupon_type: couponForm.coupon_type,
        coupon_description: couponForm.coupon_description,
        coupon_amount: couponForm.coupon_amount,
        coupon_start_date: couponForm.coupon_start_date,
        coupon_end_date: couponForm.coupon_end_date,
        coupon_is_individual: couponForm.coupon_is_individual,
        coupon_is_limited: couponForm.coupon_is_limited,
        coupon_limit: couponForm.coupon_limit,
        coupon_categories: couponForm.coupon_categories,
        include_product_categories: couponForm.include_product_categories,
        exclude_product_categories: couponForm.exclude_product_categories,
        excluded_products: couponForm.excluded_products || [],
        included_products: couponForm.included_products || [],
        coupon_min_purchase: couponForm.coupon_min_purchase,
        coupon_is_max_disc: couponForm.coupon_is_max_disc,
        coupon_max_amount_disc: couponForm.coupon_max_amount_disc,
        coupon_free_item_name: couponForm.coupon_free_item_name || '',
        coupon_free_item_products: freeItemProducts,
        coupon_is_unique_user: couponForm.coupon_is_unique_user,
        coupon_is_noticed: couponForm.coupon_is_noticed,
        coupon_notice_desc: couponForm.coupon_notice_desc,
        coupon_is_highlight: couponForm.coupon_is_highlight || false,
        coupon_is_public: couponForm.coupon_is_public ?? true,
    };

    return {
        status: true,
        data,
    };
};

const validateInput = (couponForm: Coupon): string | null => {
    if (!couponForm.coupon_name) {
        return 'Coupon code is required.';
    }
    if (!couponForm.coupon_title) {
        return 'Coupon title is required.';
    }
    if (couponForm.coupon_type !== 'free_item' && (!couponForm.coupon_amount || couponForm.coupon_amount <= 0)) {
        return 'Coupon amount is required.';
    }
    if (couponForm.coupon_type === 'free_item') {
        const products = Array.isArray(couponForm.coupon_free_item_products)
            ? couponForm.coupon_free_item_products.filter(Boolean)
            : [];
        if (products.length === 0) {
            return 'Free item products are required.';
        }
    }
    if (couponForm.coupon_type === 'percentage' && couponForm.coupon_amount > 100) {
        return 'Discount cannot exceed  100% ';
    }
    if (couponForm.coupon_is_limited && couponForm.coupon_limit <= 0) {
        return 'At least one usage is required to apply the discount limit.';
    }
    if (couponForm.coupon_is_noticed) {
        if (!couponForm.coupon_notice_desc) {
            return 'Store Notice description is required.';
        }
        if (!couponForm.coupon_end_date) {
            return 'End date is required when Notice Coupon is on.';
        }
        const noticeEndDate = new Date(couponForm.coupon_end_date);
        if (Number.isNaN(noticeEndDate.getTime()) || noticeEndDate <= new Date()) {
            return 'End date must be in the future when Notice Coupon is on.';
        }
    }

    // Check if there is at least one common element
    const hasCommonElement = couponForm.include_product_categories.some((category) => couponForm.exclude_product_categories.includes(category));
    if (hasCommonElement) {
        return 'Product categories are included and excluded simultaneously.';
    }

    const startDate = new Date(couponForm.coupon_start_date);
    const endDate = new Date(couponForm.coupon_end_date);

    if (couponForm.coupon_start_date && couponForm.coupon_end_date) {
        if (startDate > endDate) {
            return 'Start date is later than end date';
        }
    }

    return null;
};
