import { BaseURL, WithoutAuthCampaignAPI } from '@/Utils/APIRequest/Endpoints';
import {
    buildCampaignOgImageUrl,
    buildConnectorDefaultOgImageUrl,
    buildPublicCampaignBannerUrl,
    PRIVATE_CAMPAIGN_SHARE_TITLE,
    trimShareDescription,
} from '@/Utils/Other/campaignShare';

export type PublicCampaignBrandUser = {
    id?: string;
    slug?: string;
    display_name?: string;
    first_name?: string;
    last_name?: string;
    company_name?: string;
    image?: string;
    about_me?: string | null;
};

/** `data` from GET campaign/public/meta/{slug} */
export type PublicCampaignShareData = {
    id?: string;
    campaign_name?: string;
    slug?: string;
    profile_privacy?: 'public' | 'private' | string;
    /**
     * Old format: filename string. New format: object keyed by filename with
     * focal-point coords, e.g. `{ 'banner.jpg': { x, y } }`.
     * Combine the filename with response `base_url` for the full banner URL.
     */
    campaign_image?: string | Record<string, { x?: number; y?: number }> | null;
    /** Banner filenames from public meta API (primary source for og:image). */
    attachment?: Array<string | Record<string, unknown>> | null;
    users?: PublicCampaignBrandUser;
};

type PublicCampaignApiResponse = {
    data?: PublicCampaignShareData;
    /** CDN prefix for campaign banner files only, e.g. https://.../files/campaign/ */
    base_url?: string;
};

export type PublicCampaignFetchResult = {
    campaign: PublicCampaignShareData;
    /** Use only with `campaign.campaign_image` to build OG/Twitter banner URL */
    campaignImageBaseUrl: string | null;
};

export async function fetchPublicCampaignBySlug(slug: string): Promise<PublicCampaignFetchResult | null> {
    try {
        const url = `${BaseURL}${WithoutAuthCampaignAPI}/${slug}`;
        const res = await fetch(url, {
            cache: 'no-store',
            headers: { Accept: 'application/json' },
        });
        if (res.status === 404) {
            let campaignImageBaseUrl: string | null = null;
            try {
                const json: PublicCampaignApiResponse = await res.json();
                campaignImageBaseUrl = json.base_url?.trim() || null;
            } catch {
                // ignore parse errors
            }

            return {
                campaign: { profile_privacy: 'private' },
                campaignImageBaseUrl,
            };
        }

        if (!res.ok) return null;

        const json: PublicCampaignApiResponse = await res.json();
        const campaign = json?.data;
        const campaignImageBaseUrl = json.base_url?.trim() || null;
        if (!campaign) return null;
        const privacy = campaign?.profile_privacy?.toString().trim().toLowerCase();
        if (privacy === 'private') {
            return {
                campaign,
                campaignImageBaseUrl,
            };
        }

        if (!campaign?.slug && !campaign?.id) return null;

        return {
            campaign,
            campaignImageBaseUrl,
        };
    } catch {
        return null;
    }
}

export function getPublicCampaignBrandName(users?: PublicCampaignBrandUser): string {
    if (!users) return '';
    if (users.company_name?.trim()) return users.company_name.trim();
    if (users.display_name?.trim()) return users.display_name.trim();
    return [users.first_name, users.last_name].filter(Boolean).join(' ').trim();
}

export function isPrivateCampaignShare(fetchResult: PublicCampaignFetchResult | null): boolean {
    const privacy = fetchResult?.campaign?.profile_privacy?.toString().trim().toLowerCase();
    return privacy === 'private';
}

export function buildCampaignShareMetadata(
    fetchResult: PublicCampaignFetchResult | null,
    slug: string,
) {
    if (isPrivateCampaignShare(fetchResult)) {
        return {
            title: PRIVATE_CAMPAIGN_SHARE_TITLE,
            description: "",
            image: buildConnectorDefaultOgImageUrl(),
            campaign: fetchResult?.campaign,
        };
    }

    const campaign = fetchResult?.campaign;
    const campaignName = campaign?.campaign_name?.trim() || slug;
    const brandName = getPublicCampaignBrandName(campaign?.users);
    const title = brandName ? `${campaignName} - ${brandName}` : campaignName;
    const description = campaign?.users?.about_me ? trimShareDescription(campaign?.users?.about_me) : '';
    const image =
        buildPublicCampaignBannerUrl(
            campaign?.campaign_image,
            fetchResult?.campaignImageBaseUrl,
        )
        ?? buildCampaignOgImageUrl(
            campaign?.attachment,
            fetchResult?.campaignImageBaseUrl,
        )
        ?? buildConnectorDefaultOgImageUrl();

    return { title, description, image, campaign };
}
