import type { AchievementsPayload } from '../services/achievementApi';
import type { EventData, EventPackage, EventStats } from '../services/eventApi';
import type { GalleryMetaResponse, GalleryPhotoResource } from '../services/galleryApi';

export type DemoTask = {
  id: number;
  title: string;
  description: string;
  duration?: number;
  emotion?: {
    slug: string;
    name: string;
    emoji?: string;
  } | null;
  category?: string | null;
};

export type DemoPhoto = {
  id: number;
  url: string;
  thumbnail_url: string;
  created_at: string;
  uploader_name: string;
  likes_count: number;
  task_id?: number | null;
  task_title?: string | null;
  ingest_source?: string | null;
};

export type DemoEmotion = {
  id: number;
  slug: string;
  name: string;
  emoji: string;
  description?: string;
};

export type DemoNotification = {
  id: number;
  type: string;
  title: string;
  body: string;
  status: 'new' | 'read' | 'dismissed';
  created_at: string;
  cta?: { label: string; href: string } | null;
};

export type DemoSharePayload = {
  slug: string;
  expires_at?: string;
  photo: {
    id: number;
    title: string;
    likes_count: number;
    emotion?: { name: string; emoji: string } | null;
    image_urls: { full: string; thumbnail: string };
  };
  event?: { id: number; name: string } | null;
};

export interface DemoFixtures {
  token: string;
  event: EventData;
  stats: EventStats;
  eventPackage: EventPackage;
  tasks: DemoTask[];
  photos: DemoPhoto[];
  gallery: {
    meta: GalleryMetaResponse;
    photos: GalleryPhotoResource[];
  };
  achievements: AchievementsPayload;
  emotions: DemoEmotion[];
  notifications: DemoNotification[];
  share: DemoSharePayload;
}

const now = () => new Date().toISOString();

export const demoFixtures: DemoFixtures = {
  token: 'demo',
  event: {
    id: 999,
    slug: 'demo-wedding-2025',
    name: 'Demo Wedding 2025',
    default_locale: 'de',
    created_at: '2025-01-10T12:00:00Z',
    updated_at: now(),
    branding: {
      primary_color: '#FF6B6B',
      secondary_color: '#FEB47B',
      background_color: '#FFF7F5',
      font_family: '"General Sans", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
      logo_url: null,
    },
    join_token: 'demo',
    type: {
      slug: 'wedding',
      name: 'Hochzeit',
      icon: 'sparkles',
    },
  },
  stats: {
    onlineGuests: 42,
    tasksSolved: 187,
    latestPhotoAt: now(),
  },
  eventPackage: {
    id: 501,
    event_id: 999,
    package_id: 301,
    used_photos: 820,
    used_guests: 95,
    expires_at: '2025-12-31T23:59:59Z',
    package: {
      id: 301,
      name: 'Soulmate Unlimited',
      max_photos: 5000,
      max_guests: 250,
      gallery_days: 365,
    },
    limits: {
      photos: {
        limit: 5000,
        used: 820,
        remaining: 4180,
        percentage: 0.164,
        state: 'ok',
        threshold_reached: null,
        next_threshold: 0.5,
        thresholds: [0.5, 0.8],
      },
      guests: {
        limit: 250,
        used: 95,
        remaining: 155,
        percentage: 0.38,
        state: 'ok',
        threshold_reached: null,
        next_threshold: 0.6,
        thresholds: [0.6, 0.9],
      },
      gallery: {
        state: 'ok',
        expires_at: '2025-12-31T23:59:59Z',
        days_remaining: 320,
        warning_thresholds: [30, 7],
        warning_triggered: null,
        warning_sent_at: null,
        expired_notified_at: null,
      },
      can_upload_photos: true,
      can_add_guests: true,
    },
  },
  tasks: [
    {
      id: 101,
      title: 'Der erste Blick',
      description: 'Haltet den Moment fest, wenn sich das Paar zum ersten Mal sieht.',
      duration: 4,
      emotion: { slug: 'romance', name: 'Romantik', emoji: '💞' },
    },
    {
      id: 102,
      title: 'Dancefloor Close-Up',
      description: 'Zoomt auf Hände, Schuhe oder Accessoires, die auf der Tanzfläche glänzen.',
      duration: 3,
      emotion: { slug: 'party', name: 'Party', emoji: '🎉' },
    },
    {
      id: 103,
      title: 'Tischgespräche',
      description: 'Fotografiert zwei Personen, die heimlich lachen.',
      duration: 2,
      emotion: { slug: 'fun', name: 'Spaß', emoji: '😄' },
    },
    {
      id: 104,
      title: 'Team Selfie',
      description: 'Mindestens fünf Gäste auf einem Selfie – Bonus für wilde Posen.',
      duration: 5,
      emotion: { slug: 'squad', name: 'Squad Goals', emoji: '🤳' },
    },
  ],
  photos: [
    {
      id: 8801,
      url: 'https://images.unsplash.com/photo-1520854223477-5e2c1a6610f0?auto=format&fit=crop&w=1600&q=80',
      thumbnail_url: 'https://images.unsplash.com/photo-1520854223477-5e2c1a6610f0?auto=format&fit=crop&w=600&q=60',
      created_at: '2025-05-10T18:45:00Z',
      uploader_name: 'Lena',
      likes_count: 24,
      task_id: 101,
      task_title: 'Der erste Blick',
      ingest_source: 'guest',
    },
    {
      id: 8802,
      url: 'https://images.unsplash.com/photo-1502727135889-a63a201a02f9?auto=format&fit=crop&w=1600&q=80',
      thumbnail_url: 'https://images.unsplash.com/photo-1502727135889-a63a201a02f9?auto=format&fit=crop&w=600&q=60',
      created_at: '2025-05-10T19:12:00Z',
      uploader_name: 'Nico',
      likes_count: 31,
      task_id: 102,
      task_title: 'Dancefloor Close-Up',
      ingest_source: 'guest',
    },
    {
      id: 8803,
      url: 'https://images.unsplash.com/photo-1524504388940-b1c1722653e1?auto=format&fit=crop&w=1600&q=80',
      thumbnail_url: 'https://images.unsplash.com/photo-1524504388940-b1c1722653e1?auto=format&fit=crop&w=600&q=60',
      created_at: '2025-05-10T19:40:00Z',
      uploader_name: 'Aylin',
      likes_count: 18,
      task_id: 103,
      task_title: 'Tischgespräche',
      ingest_source: 'guest',
    },
    {
      id: 8804,
      url: 'https://images.unsplash.com/photo-1519741497674-611481863552?auto=format&fit=crop&w=1600&q=80',
      thumbnail_url: 'https://images.unsplash.com/photo-1519741497674-611481863552?auto=format&fit=crop&w=600&q=60',
      created_at: '2025-05-10T20:05:00Z',
      uploader_name: 'Mara',
      likes_count: 42,
      task_id: 104,
      task_title: 'Team Selfie',
      ingest_source: 'guest',
    },
  ],
  gallery: {
    meta: {
      event: {
        id: 999,
        name: 'Demo Wedding 2025',
        slug: 'demo-wedding-2025',
        description: 'Erlebe die Story eines Demo-Events – Fotos, Aufgaben und Emotionen live in der PWA.',
        gallery_expires_at: '2025-12-31T23:59:59Z',
      },
      branding: {
        primary_color: '#FF6B6B',
        secondary_color: '#FEB47B',
        background_color: '#FFF7F5',
      },
    },
    photos: [
      {
        id: 9001,
        thumbnail_url: 'https://images.unsplash.com/photo-1520854223477-5e2c1a6610f0?auto=format&fit=crop&w=400&q=60',
        full_url: 'https://images.unsplash.com/photo-1520854223477-5e2c1a6610f0?auto=format&fit=crop&w=1600&q=80',
        download_url: 'https://images.unsplash.com/photo-1520854223477-5e2c1a6610f0?auto=format&fit=crop&w=1600&q=80',
        likes_count: 18,
        guest_name: 'Leonie',
        created_at: '2025-05-10T18:40:00Z',
      },
      {
        id: 9002,
        thumbnail_url: 'https://images.unsplash.com/photo-1502727135889-a63a201a02f9?auto=format&fit=crop&w=400&q=60',
        full_url: 'https://images.unsplash.com/photo-1502727135889-a63a201a02f9?auto=format&fit=crop&w=1600&q=80',
        download_url: 'https://images.unsplash.com/photo-1502727135889-a63a201a02f9?auto=format&fit=crop&w=1600&q=80',
        likes_count: 25,
        guest_name: 'Chris',
        created_at: '2025-05-10T19:10:00Z',
      },
    ],
  },
  achievements: {
    summary: {
      totalPhotos: 820,
      uniqueGuests: 96,
      tasksSolved: 312,
      likesTotal: 2100,
    },
    personal: {
      guestName: 'Demo Gast',
      photos: 12,
      tasks: 5,
      likes: 38,
      badges: [
        { id: 'starter', title: 'Warm-up', description: 'Deine ersten 3 Fotos', earned: true, progress: 3, target: 3 },
        { id: 'mission', title: 'Mission Master', description: '5 Aufgaben geschafft', earned: true, progress: 5, target: 5 },
        { id: 'marathon', title: 'Galerie-Profi', description: '50 Fotos hochladen', earned: false, progress: 12, target: 50 },
      ],
    },
    leaderboards: {
      uploads: [
        { guest: 'Sven', photos: 35, likes: 120 },
        { guest: 'Lena', photos: 28, likes: 140 },
        { guest: 'Demo Gast', photos: 12, likes: 38 },
      ],
      likes: [
        { guest: 'Mara', photos: 18, likes: 160 },
        { guest: 'Noah', photos: 22, likes: 150 },
        { guest: 'Sven', photos: 35, likes: 120 },
      ],
    },
    highlights: {
      topPhoto: {
        photoId: 8802,
        guest: 'Nico',
        likes: 31,
        task: 'Dancefloor Close-Up',
        createdAt: '2025-05-10T19:12:00Z',
        thumbnail: 'https://images.unsplash.com/photo-1502727135889-a63a201a02f9?auto=format&fit=crop&w=600&q=60',
      },
      trendingEmotion: {
        emotionId: 4,
        name: 'Party',
        count: 58,
      },
      timeline: [
        { date: '2025-05-08', photos: 120, guests: 25 },
        { date: '2025-05-09', photos: 240, guests: 40 },
        { date: '2025-05-10', photos: 460, guests: 55 },
      ],
    },
    feed: [
      {
        photoId: 8804,
        guest: 'Mara',
        task: 'Team Selfie',
        likes: 42,
        createdAt: '2025-05-10T20:05:00Z',
        thumbnail: 'https://images.unsplash.com/photo-1519741497674-611481863552?auto=format&fit=crop&w=400&q=60',
      },
      {
        photoId: 8803,
        guest: 'Aylin',
        task: 'Tischgespräche',
        likes: 18,
        createdAt: '2025-05-10T19:40:00Z',
        thumbnail: 'https://images.unsplash.com/photo-1524504388940-b1c1722653e1?auto=format&fit=crop&w=400&q=60',
      },
    ],
  },
  emotions: [
    { id: 1, slug: 'romance', name: 'Romantik', emoji: '💞', description: 'Samtweiche Szenen & verliebte Blicke' },
    { id: 2, slug: 'party', name: 'Party', emoji: '🎉', description: 'Alles, was knallt und funkelt' },
    { id: 3, slug: 'calm', name: 'Ruhepause', emoji: '🌙', description: 'Leise Momente zum Durchatmen' },
    { id: 4, slug: 'squad', name: 'Squad Goals', emoji: '🤳', description: 'Teams, Crews und wilde Selfies' },
  ],
  notifications: [
    {
      id: 1,
      type: 'broadcast',
      title: 'Mission-Alarm',
      body: 'Neue Spotlight-Aufgabe verfügbar: „Dancefloor Close-Up“. Schau gleich vorbei!'
        + ' ',
      status: 'new',
      created_at: now(),
      cta: { label: 'Zur Aufgabe', href: '/e/demo/tasks' },
    },
    {
      id: 2,
      type: 'broadcast',
      title: 'Galerie wächst',
      body: '18 neue Uploads in den letzten 30 Minuten – helft mit beim Kuratieren!',
      status: 'read',
      created_at: '2025-05-10T19:50:00Z',
    },
  ],
  share: {
    slug: 'demo-share',
    expires_at: undefined,
    photo: {
      id: 8801,
      title: 'First Look',
      likes_count: 24,
      emotion: { name: 'Romantik', emoji: '💞' },
      image_urls: {
        full: 'https://images.unsplash.com/photo-1520854223477-5e2c1a6610f0?auto=format&fit=crop&w=1600&q=80',
        thumbnail: 'https://images.unsplash.com/photo-1520854223477-5e2c1a6610f0?auto=format&fit=crop&w=600&q=60',
      },
    },
    event: { id: 999, name: 'Demo Wedding 2025' },
  },
};
