(function () {
  const { createContext, useContext, useState, useMemo, useCallback } = React;

  const AppContext = createContext(null);

  // 服务类目
  const SERVICES = {
    feed:    { label: '喂养', icon: '🍖', color: '#E08840', bg: '#FFE0C2' },
    clean:   { label: '清洁', icon: '🧼', color: '#5BA8C9', bg: '#D6F0FB' },
    walk:    { label: '遛狗', icon: '🦮', color: '#FF8C42', bg: '#FFE9B0' },
    sit:     { label: '寄养', icon: '🏠', color: '#7DBE7D', bg: '#D8F0D8' },
    groom:   { label: '美容', icon: '✂️', color: '#D14770', bg: '#FFDCE4' },
    train:   { label: '训练', icon: '🎾', color: '#B58FD9', bg: '#EBDDF6' },
    funeral: { label: '殡葬', icon: '🕊️', color: '#6B7A8F', bg: '#E2E8F0' },
    other:   { label: '其他', icon: '✨', color: '#8A5A2B', bg: '#F0E5D5' },
  };

  const SERVICE_KEYS = ['feed','clean','walk','sit','groom','train','funeral','other'];

  // 服务者主页
  const PROVIDERS = [
    {
      id: 'sv1', name: '橘橘宠物生活馆', emoji: '🏪', type: 'shop',
      tag: '星级宠物店', cover: '🏪',
      authStatus: 'verified', authType: '宠物店',
      services: ['feed','clean','walk','groom'],
      online: true, featured: true, status: '营业中',
      rating: 4.96, reviews: 312, served: 528,
      area: '黄浦区·新天地', address: '上海市黄浦区新天地北里 12号 1F',
      distance: '0.6km', responseTime: 3, repeatRate: '92%',
      intro: '开店 6 年的小型宠物综合店,主理人 5 年训犬经验。每只来过的毛孩子都会拍照打卡留念。',
      images: ['🐕','🐱','🏠','🛁','🍖','🦴'],
      contact: '微信预约',
      itemCount: 8,
    },
    {
      id: 'sv2', name: '林一岚医师', emoji: '🧑‍⚕️', type: 'personal',
      tag: '宠医实习生', cover: '🩺',
      authStatus: 'verified', authType: '个人服务者',
      services: ['feed','sit','other'],
      online: true, featured: true, status: '营业中',
      rating: 4.92, reviews: 158, served: 186,
      area: '虹口区·瑞虹新城', address: '上海市虹口区瑞虹新城一期',
      distance: '1.2km', responseTime: 5, repeatRate: '88%',
      intro: '上海宠物医院在读,熟悉常见病症与急救处理。陪诊+送医优选,擅长安抚紧张的小动物。',
      images: ['🐕','🐱','💊','🚗','🌸','✨'],
      contact: '私信预约',
      itemCount: 5,
    },
    {
      id: 'sv3', name: '阿凯训犬工作室', emoji: '🧔', type: 'shop',
      tag: '资深训犬师', cover: '🎾',
      authStatus: 'verified', authType: '宠物店',
      services: ['train','walk'],
      online: false, featured: false, status: '已暂停',
      rating: 4.85, reviews: 92, served: 145,
      area: '徐汇区·永康路', address: '上海市徐汇区永康路 88弄',
      distance: '1.8km', responseTime: 12, repeatRate: '85%',
      intro: '7年训犬经验,擅长正向训练。坐立、握手、定点拉粑粑全套教学,4周见效。',
      images: ['🐕','🎾','🦴','🌳','✨','🏆'],
      contact: '电话预约',
      itemCount: 4,
    },
    {
      id: 'sv4', name: '糯米猫窝', emoji: '👩‍🦰', type: 'personal',
      tag: '猫咪专科', cover: '🐱',
      authStatus: 'verified', authType: '个人服务者',
      services: ['sit','feed','clean','groom'],
      online: true, featured: true, status: '营业中',
      rating: 4.98, reviews: 256, served: 268,
      area: '静安区·愚园路', address: '上海市静安区愚园路 100号',
      distance: '2.0km', responseTime: 4, repeatRate: '95%',
      intro: '专属猫派! 家中 3只布偶,深知猫主子的小脾气,寄养期间日常拍照打卡,主人放心。',
      images: ['🐱','🐈','🛁','🛏️','✨','💕'],
      contact: '私信预约',
      itemCount: 6,
    },
    {
      id: 'sv5', name: '夏小麦', emoji: '👨‍🎓', type: 'personal',
      tag: '大学生兼职', cover: '🎒',
      authStatus: 'pending', authType: '个人服务者',
      services: ['walk','feed'],
      online: true, featured: false, status: '审核中',
      rating: 4.78, reviews: 64, served: 78,
      area: '杨浦区·五角场', address: '上海市杨浦区五角场创智天地',
      distance: '0.9km', responseTime: 6, repeatRate: '80%',
      intro: '复旦大三学生,周末和晚上时段全空,熟悉学校周边各种宠物友好场所。',
      images: ['🐕','🎓','🌳','☀️','🐾','✨'],
      contact: '私信预约',
      itemCount: 3,
    },
    {
      id: 'sv6', name: '宁姐家庭寄养', emoji: '👩', type: 'personal',
      tag: '退休教师', cover: '🏡',
      authStatus: 'verified', authType: '个人服务者',
      services: ['sit','feed','walk'],
      online: true, featured: false, status: '营业中',
      rating: 4.94, reviews: 142, served: 164,
      area: '浦东·世纪公园', address: '上海市浦东新区世纪公园西门',
      distance: '2.8km', responseTime: 8, repeatRate: '90%',
      intro: '退休后家有大院子,可短期/长期寄养。养过 8只狗狗,擅长老年宠物照护和耐心陪伴。',
      images: ['🐕','🏡','🌳','🌿','☀️','🦴'],
      contact: '电话预约',
      itemCount: 4,
    },
  ];

  // 服务项目
  const SERVICE_ITEMS = [
    { id: 'i1', providerId: 'sv1', name: '专业犬舍上门美容', type: 'groom',
      price: '¥128 / 次起', desc: '日式精修 · 含洗澡剪毛修脚趾耳道清洁,适合 30 斤以内中小型犬。',
      images: ['✂️','🛁','🐕','✨','💕','🌸','🦴','🎀','📷'], status: '已上架', views: 1284, favs: 86 },
    { id: 'i2', providerId: 'sv1', name: '上门遛狗 45 分钟',  type: 'walk',
      price: '¥38 / 次',     desc: '专业遛狗员上门,GPS 轨迹实时同步主人。',
      images: ['🦮','🐕','🌳','☀️','🐾','✨','💧','🦴'], status: '已上架', views: 956,  favs: 64 },
    { id: 'i3', providerId: 'sv2', name: '宠医陪诊送医',     type: 'other',
      price: '¥158 / 单趟',  desc: '专业宠医陪诊,送至指定医院,沟通医生病情。',
      images: ['💊','🚗','🐱','🐕','🏥','🩺'], status: '已上架', views: 528, favs: 42 },
    { id: 'i4', providerId: 'sv4', name: '猫咪短期寄养',     type: 'sit',
      price: '¥80 / 天',     desc: '家庭式寄养,有独立猫房,每日 3 次互动打卡。',
      images: ['🐱','🐈','🛏️','💕','✨','🦴','🎀','🌸','📷'], status: '已上架', views: 1856, favs: 152 },
    { id: 'i5', providerId: 'sv6', name: '老年犬寄养陪伴',   type: 'sit',
      price: '¥100 / 天',    desc: '专业老年犬照护,有花园可日晒,熟悉慢病护理。',
      images: ['🐕','🏡','🌳','☀️','💕'], status: '已上架', views: 642, favs: 38 },
  ];

  // 私信会话
  const CONVERSATIONS = [
    { id: 'c1', providerId: 'sv1', providerName: '橘橘宠物生活馆', providerEmoji: '🏪',
      lastMsg: '好的,周六下午 3 点准时上门~', time: '14:32', unread: 0, pinned: true, online: true },
    { id: 'c2', providerId: 'sv4', providerName: '糯米猫窝', providerEmoji: '👩‍🦰',
      lastMsg: '汤圆今天又霸占了我的工位 [图片]', time: '12:08', unread: 2, pinned: false, online: true },
    { id: 'c3', providerId: 'sv2', providerName: '林一岚医师', providerEmoji: '🧑‍⚕️',
      lastMsg: '雪糕的体检报告已经发您微信了',   time: '昨天', unread: 0, pinned: false, online: true },
    { id: 'c4', providerId: 'sv6', providerName: '宁姐家庭寄养', providerEmoji: '👩',
      lastMsg: '布丁今天吃了 2 根胡萝卜~',     time: '昨天', unread: 1, pinned: false, online: true },
    { id: 'c5', providerId: 'sv3', providerName: '阿凯训犬工作室', providerEmoji: '🧔',
      lastMsg: '阿福本周训练总结报告',         time: '周一', unread: 0, pinned: false, online: false },
  ];

  // 单个会话的消息
  const CHAT_MESSAGES = {
    c1: [
      { id: 1, type: 'time', text: '今天 14:00' },
      { id: 2, from: 'them', text: '您好~ 看到您预约了犬舍上门美容,请问需要哪个时间段?' },
      { id: 3, from: 'me',   text: '周六下午方便吗?家里是只 3 岁柯基,叫可乐 🐕' },
      { id: 4, from: 'them', text: '可以的~ 上次给可乐做过造型,这次还是日式精修吗?' },
      { id: 5, from: 'me',   text: '是的,再帮 ta 修一下耳道,谢谢!' },
      { id: 6, from: 'them', text: '好的,周六下午 3 点准时上门~', read: true },
    ],
    c2: [
      { id: 1, type: 'time', text: '今天 12:00' },
      { id: 2, from: 'them', text: '汤圆今天主动来蹭我啦' },
      { id: 3, from: 'them', text: '汤圆今天又霸占了我的工位 [图片]', isImg: true },
    ],
  };

  // 系统通知
  const NOTIFICATIONS = [
    { id: 'n1', type: 'comment',  icon: '💬', title: '糯米猫窝',     content: '回复了您的评论: 谢谢您信任~', time: '2 小时前', unread: true },
    { id: 'n2', type: 'review',   icon: '⭐', title: '收到新评价',   content: '小张主人给您的服务打了 5星',   time: '5 小时前', unread: true },
    { id: 'n3', type: 'favorite', icon: '♥',  title: '新增收藏',     content: 'AA 把您的服务项目收藏了',     time: '昨天',     unread: false },
    { id: 'n4', type: 'auth',     icon: '✓',  title: '认证通过',     content: '您的个人服务者认证已通过',   time: '3 天前',   unread: false },
  ];

  // 首页 Banner
  const BANNERS = [
    { id: 'b1', title: '夏季限时活动', sub: '宠物美容八折', bg: 'linear-gradient(135deg, #FF8C42 0%, #FFB877 100%)', emoji: '✂️' },
    { id: 'b2', title: '认证服务者', sub: '安心放心',     bg: 'linear-gradient(135deg, #7DBE7D 0%, #A8DFA8 100%)', emoji: '✓' },
    { id: 'b3', title: '新人专享',   sub: '首次预约送好礼', bg: 'linear-gradient(135deg, #D14770 0%, #FF99B6 100%)', emoji: '🎁' },
  ];

  const HOT_KEYWORDS = ['上门美容', '猫咪寄养', '遛狗', '柴犬训练', '老年犬照护', '剪指甲'];

  // 当前用户
  const ME = {
    id: 'u1', name: '木木', avatar: '🐶', phone: '155****8888',
    bound: true, level: 'V3·活跃用户',
    location: '上海·黄浦区',
    pets: [
      { name: '橘子', type: 'dog', breed: '金毛', age: '4岁', tag: '大暖男' },
      { name: '雪宝', type: 'cat', breed: '英短银渐层', age: '2岁', tag: '小公主' },
    ],
    // 服务者身份
    isProvider: true,
    providerId: 'sv1',
    authStatus: 'verified', // 'none' | 'pending' | 'verified' | 'rejected'
    authType: '宠物店',
    authExpire: '2026-12-31',
    stats: { views: 8642, favs: 312, msgs: 256, orders: 128 },
    // 我的收藏
    favProviders: ['sv1','sv2','sv4'],
    favItems: ['i1','i4'],
  };

  function AppContextProvider({ children }) {
    const [activeTab, setActiveTab] = useState('home');
    const [route, setRoute] = useState({ name: null, params: null }); // 详情/聊天/认证页栈
    const [toast, setToast] = useState(null);
    const [mascotMood, setMascotMood] = useState('happy');
    const [favProviders, setFavProviders] = useState(ME.favProviders);
    const [favItems, setFavItems] = useState(ME.favItems);

    const pushRoute = useCallback((name, params) => setRoute({ name, params }), []);
    const popRoute = useCallback(() => setRoute({ name: null, params: null }), []);

    const showToast = useCallback((msg, sub, type = 'success') => {
      setToast({ msg, sub, type });
      setTimeout(() => setToast(null), 2800);
    }, []);

    const toggleFavProvider = useCallback((id) => {
      setFavProviders(prev => prev.includes(id) ? prev.filter(i => i !== id) : [...prev, id]);
    }, []);
    const toggleFavItem = useCallback((id) => {
      setFavItems(prev => prev.includes(id) ? prev.filter(i => i !== id) : [...prev, id]);
    }, []);

    const getProvider = useCallback((id) => PROVIDERS.find(p => p.id === id), []);
    const getItem     = useCallback((id) => SERVICE_ITEMS.find(p => p.id === id), []);
    const getConv     = useCallback((id) => CONVERSATIONS.find(c => c.id === id), []);

    const value = useMemo(() => ({
      activeTab, setActiveTab,
      route, pushRoute, popRoute,
      services: SERVICES,
      serviceKeys: SERVICE_KEYS,
      providers: PROVIDERS,
      items: SERVICE_ITEMS,
      conversations: CONVERSATIONS,
      chatMessages: CHAT_MESSAGES,
      notifications: NOTIFICATIONS,
      banners: BANNERS,
      hotKeywords: HOT_KEYWORDS,
      me: ME,
      toast, showToast,
      mascotMood, setMascotMood,
      favProviders, toggleFavProvider,
      favItems, toggleFavItem,
      getProvider, getItem, getConv,
    }), [activeTab, route, toast, mascotMood, favProviders, favItems, showToast, pushRoute, popRoute, toggleFavProvider, toggleFavItem, getProvider, getItem, getConv]);

    return <AppContext.Provider value={value}>{children}</AppContext.Provider>;
  }

  function useApp() {
    return useContext(AppContext);
  }

  window.__SHAPE__.AppContext = AppContext;
  window.__SHAPE__.AppContextProvider = AppContextProvider;
  window.__SHAPE__.useApp = useApp;
})();
