export type Platform = 'twitter' | 'instagram' | 'tiktok' | 'youtube' | 'linkedin' | 'facebook' | 'reddit';
export const PLATFORMS: Platform[] = ['twitter', 'instagram', 'tiktok', 'youtube', 'linkedin', 'facebook', 'reddit'];
export interface Author {
username: string;
displayName: string;
followers?: number;
verified?: boolean;
profileUrl?: string;
}
export interface Engagement {
likes: number;
comments: number;
shares: number;
views?: number;
}
export interface Media {
type: 'image' | 'video' | 'text';
urls: string[];
}
export interface UnifiedPost {
id: string; // platform:originalId
platform: Platform;
author: Author;
content: string; // text body / caption / title
url: string;
timestamp: Date;
engagement: Engagement;
media?: Media;
hashtags: string[];
metadata: Record<string, unknown>; // platform-specific extras
}
export interface ScrapeResult {
posts: UnifiedPost[];
stats: {
total: number;
avgEngagement: number;
topPost: UnifiedPost | null;
};
savedToTimeline: boolean;
}
export interface SentimentResult {
score: number; // -5 to +5
label: 'positive' | 'negative' | 'neutral' | 'mixed';
breakdown: {
positive: number;
negative: number;
neutral: number;
};
}
export interface TrendItem {
topic: string;
count: number;
growth: number; // percentage change from previous window
sentiment: number; // average sentiment score
platforms: Platform[];
}
export interface ProfileAnalysis {
platform: Platform;
username: string;
postCount: number;
avgEngagement: number;
engagementRate: number;
postingFrequency: string;
topHashtags: string[];
peakPostingHours: number[];
sentiment: SentimentResult;
recentPosts: UnifiedPost[];
}
export interface TimelineStats {
totalPosts: number;
byPlatform: Record<Platform, number>;
dateRange: { earliest: Date; latest: Date } | null;
topAuthors: { username: string; platform: Platform; count: number }[];
topHashtags: { tag: string; count: number }[];
avgEngagement: Record<Platform, number>;
}