import CustomFetch from '@/Utils/APIRequest/AxiosInstance';
import { JobListingAPI } from '@/Utils/APIRequest/Endpoints';
import { fetchPublicCampaignBySlug } from '@/Utils/Other/fetchPublicCampaignMetadata';

export type ResolvedCampaignRef = {
    slug: string;
    campaignDetailId: string | number;
    isPrivate?: boolean;
};

const fromListItem = (item: { slug?: string; id?: string | number }, slug: string): ResolvedCampaignRef | null => {
    if (item?.id) {
        return { slug: item.slug ?? slug, campaignDetailId: item.id };
    }
    return null;
};

/** Uses only influencer-safe endpoints (never brand campaign/{slug} — that 401s and logs the user out). */
async function findInJobListing(slug: string): Promise<ResolvedCampaignRef | null> {
    const maxPages = 20;
    const perPage = 50;

    for (let page = 1; page <= maxPages; page++) {
        const response = await CustomFetch(
            {
                url: JobListingAPI,
                params: {
                    page,
                    per_page: perPage,
                    status: 'all',
                    sort_by: 'created_at',
                    sort: 'DESC',
                },
            },
            null,
            false,
        );

        if (!response?.data) {
            break;
        }

        const list = response.data?.data;
        if (!Array.isArray(list) || list.length === 0) {
            break;
        }

        const match = list.find((job) => job?.slug === slug);
        if (match) {
            return fromListItem(match, slug);
        }

        if (!response.data?.hasMoreResults) {
            break;
        }
    }

    return null;
}

export async function resolveCampaignBySlug(slug: string): Promise<ResolvedCampaignRef | null> {
    const publicResult = await fetchPublicCampaignBySlug(slug);
    const publicData = publicResult?.campaign;
    const privacy = publicData?.profile_privacy?.toString().trim().toLowerCase();
    if (privacy === 'private') {
        return {
            slug: publicData?.slug ?? slug,
            campaignDetailId: publicData?.id ?? slug,
            isPrivate: true,
        };
    }
    if (publicData?.id) {
        return { slug: publicData.slug ?? slug, campaignDetailId: publicData.id };
    }

    try {
        const response = await CustomFetch(
            { url: JobListingAPI, params: { search: slug, page: 1, per_page: 50, status: 'all' } },
            null,
            false,
        );
        const list = response?.data?.data;
        if (Array.isArray(list)) {
            const match = list.find((job) => job?.slug === slug);
            if (match) {
                return fromListItem(match, slug);
            }
        }
    } catch {
        // fall through
    }

    try {
        return await findInJobListing(slug);
    } catch {
        return null;
    }
}
