import moment from 'moment';
import {
    parseCampaignAttachment,
    serializeCampaignAttachments,
} from '@/Utils/Other/campaignAttachment';

const FALLBACK_IMAGE = '/assets/images/placeholder.jpg';

export const buildPreviewAsCreatorPayload = (
    values: any,
    {
        selectedPlatforms,
        uploadedFiles,
        selectedInfluencerTypes,
    }: {
        selectedPlatforms: string[];
        uploadedFiles: any[];
        selectedInfluencerTypes: string[];
    },
) => {
    const preparedValues: any = { ...values };
    preparedValues.budget_per_influencer = Number(preparedValues.budget_per_influencer);
    preparedValues.number_of_influencers = Number(preparedValues.number_of_influencers);
    preparedValues.product_value = Number(preparedValues.product_value);
    preparedValues.job_requirement = Array.isArray(preparedValues.job_requirement)
        ? preparedValues.job_requirement.map((option: any) => option?.value ?? option)
        : preparedValues.job_requirement;
    preparedValues.categories = Array.isArray(preparedValues.categories)
        ? preparedValues.categories.map((category: any) => category?.value ?? category)
        : preparedValues.categories;
    preparedValues.influencer_type = selectedInfluencerTypes;
    preparedValues.platforms = selectedPlatforms;
    preparedValues.attachment = serializeCampaignAttachments(uploadedFiles);

    const payload = {
        ...preparedValues,
        posting_start_date: values.posting_date_range?.[0]
            ? moment(values.posting_date_range[0]).format('YYYY-MM-DD')
            : null,
        posting_end_date: values.posting_date_range?.[1]
            ? moment(values.posting_date_range[1]).format('YYYY-MM-DD')
            : null,
        first_draft_date: values.first_draft_date
            ? moment(values.first_draft_date).format('YYYY-MM-DD')
            : null,
    };
    delete payload.posting_date_range;
    return payload;
};

export type CreatorPreviewPage = {
    own: any[];
    other: any[];
    hasMoreResults: number;
};

const emptyCreatorPreviewPage = (): CreatorPreviewPage => ({
    own: [],
    other: [],
    hasMoreResults: 0,
});

const readHasMoreResults = (raw: any, payload: any) =>
    Number(raw?.hasMoreResults ?? payload?.hasMoreResults ?? 0);

const dedupeCampaigns = (items: any[]) => {
    const seen = new Set<string | number>();
    return items.filter((item) => {
        const key = item?.id ?? item?.slug;
        if (key === undefined || key === null || seen.has(key)) return false;
        seen.add(key);
        return true;
    });
};

export const mergeCreatorPreviewPages = (
    prev: CreatorPreviewPage,
    next: CreatorPreviewPage,
): CreatorPreviewPage => ({
    own: dedupeCampaigns([...prev.own, ...next.own]),
    other: dedupeCampaigns([...prev.other, ...next.other]),
    hasMoreResults: next.hasMoreResults,
});

export const parseCreatorPreviewListing = (
    raw: any,
    brandUserId?: number,
): CreatorPreviewPage => {
    if (!raw) return emptyCreatorPreviewPage();

    const payload = raw?.data ?? raw;
    const hasMoreResults = readHasMoreResults(raw, payload);

    if (payload?.own !== undefined || payload?.other !== undefined) {
        return {
            own: Array.isArray(payload.own) ? payload.own : [],
            other: Array.isArray(payload.other) ? payload.other : [],
            hasMoreResults,
        };
    }

    if (payload?.running !== undefined) {
        const other = payload.other ?? payload.others ?? payload.other_brands ?? [];
        return {
            own: Array.isArray(payload.running) ? payload.running : [],
            other: Array.isArray(other) ? other : [],
            hasMoreResults,
        };
    }

    const list = Array.isArray(payload)
        ? payload
        : Array.isArray(payload?.data)
          ? payload.data
          : [];

    if (list.length && brandUserId) {
        return {
            own: list.filter((item: any) => item?.users?.id === brandUserId),
            other: list.filter((item: any) => item?.users?.id !== brandUserId),
            hasMoreResults,
        };
    }

    return { own: [], other: list, hasMoreResults };
};

export const mapDraftCampaign = (
    values: any,
    selectedPlatforms: string[],
    uploadedFiles: any[],
    userDetails: any,
) => {
    const jobReq = Array.isArray(values?.job_requirement)
        ? values.job_requirement.map((o: any) => o?.value ?? o).filter(Boolean)
        : [];

    const attachments = Array.isArray(uploadedFiles) && uploadedFiles.length
        ? serializeCampaignAttachments(uploadedFiles)
        : [];

    return {
        __isBrandOwned: true,
        __previewDraft: true,
        __key: 'preview-draft',
        id: 0,
        slug: 'preview-draft',
        isArchived: 0,
        isCampaignSaved: false,
        campaign_name: values?.campaign_name || '—',
        users: {
            id: userDetails?.id,
            image: userDetails?.image || FALLBACK_IMAGE,
            company_name: userDetails?.company_name || '—',
            country: userDetails?.country || '—',
        },
        platforms: selectedPlatforms || [],
        attachment: attachments,
        job_privacy: values?.job_privacy || 'in_person',
        job_requirement: jobReq,
        currency: values?.currency || 'USD',
        budget_per_influencer:
            values?.is_barter === 'true' ? 0 : Number(values?.budget_per_influencer || 0),
        product_value: Number(values?.product_value || 0),
        posting_start_date: values?.posting_date_range?.[0] || new Date(),
        posting_end_date: values?.posting_date_range?.[1] || new Date(),
        applied: 0,
        campaignInfluencers: [],
        campaign_requirements: values?.campaign_requirements || '',
        campaign_country: userDetails?.country || '',
        influencer_type: Array.isArray(values?.influencer_type) ? values.influencer_type : [],
    };
};

export const mapBrandLiveCampaign = (item: any) => ({
    ...item,
    __isBrandOwned: true,
    __previewDraft: false,
    __key: `brand-${item?.id ?? item?.slug ?? 'unknown'}`,
});

export const mapOtherBrandCampaign = (item: any) => ({
    ...item,
    __isBrandOwned: false,
    __previewDraft: false,
    __key: `other-${item?.id ?? item?.slug ?? 'unknown'}`,
});

export const buildBrandDetailFromUser = (userDetails: any) => ({
    image: userDetails?.image,
    first_name: userDetails?.first_name,
    last_name: userDetails?.last_name,
    country: userDetails?.country,
    about_me: userDetails?.about_me,
});

export const buildBrandDetailFromCampaign = (campaign: any) => {
    const user = campaign?.users;
    if (!user) return buildBrandDetailFromUser(null);

    return {
        image: user?.image,
        first_name: user?.first_name || user?.company_name || '',
        last_name: user?.last_name || '',
        country: user?.country,
        about_me: user?.about_me,
    };
};
