// 生辰档案管理工具
// 本地存储优先；已登录（存在 token）时与服务端双向同步
const { request } = require('./request.js');

const STORAGE_KEY = 'lunar-birth-profiles';
// 每个用户可免费绑定的生辰数量上限
const MAX_PROFILES = 3;

/** 读取本地生辰档案列表 */
function getProfiles() {
  return wx.getStorageSync(STORAGE_KEY) || [];
}

/** 保存本地生辰档案列表 */
function saveProfiles(profiles) {
  wx.setStorageSync(STORAGE_KEY, profiles);
}

/** 获取当前激活的档案（第一个为默认） */
function getActiveProfile() {
  const profiles = getProfiles();
  if (profiles.length === 0) return null;
  const activeId = wx.getStorageSync('lunar-birth-active-id');
  return profiles.find(p => p.id === activeId) || profiles[0];
}

/** 设置激活档案 */
function setActiveProfile(id) {
  wx.setStorageSync('lunar-birth-active-id', id);
}

/** 新增生辰档案（本地），超出上限或重复时返回错误信息 */
function addProfile(profile) {
  const profiles = getProfiles();
  if (profiles.length >= MAX_PROFILES) {
    return { ok: false, msg: `最多可免费绑定 ${MAX_PROFILES} 个生辰` };
  }
  const dup = profiles.find(p => p.birthday === profile.birthday && p.birthTime === profile.birthTime);
  if (dup) {
    return { ok: false, msg: '该生辰已绑定，请勿重复添加' };
  }
  const item = {
    id: `local-${Date.now()}`,
    name: profile.name || '未命名',
    gender: profile.gender || 'male',
    birthday: profile.birthday,
    birthTime: profile.birthTime,
    serverId: 0,
    createdAt: Date.now()
  };
  profiles.push(item);
  saveProfiles(profiles);
  if (!getActiveProfile()) setActiveProfile(item.id);
  return { ok: true, profile: item };
}

/** 删除生辰档案（本地） */
function removeProfile(id) {
  const profiles = getProfiles().filter(p => p.id !== id);
  saveProfiles(profiles);
  if (wx.getStorageSync('lunar-birth-active-id') === id) {
    setActiveProfile(profiles.length > 0 ? profiles[0].id : '');
  }
}

/** 是否已登录（存在有效 token） */
function isLoggedIn() {
  return !!wx.getStorageSync('token');
}

/** 推送单个档案到服务端（静默失败，不影响本地） */
function pushProfileToServer(profile) {
  if (!isLoggedIn()) return Promise.resolve(null);
  return request({
    url: '/api/user/birth-profiles',
    method: 'POST',
    data: {
      name: profile.name,
      gender: profile.gender === 'female' ? 2 : 1,
      birthday: profile.birthday,
      birthTime: profile.birthTime
    }
  }).then(res => {
    if (res && res.code === 0 && res.data && res.data.profile) {
      // 回填 serverId
      const profiles = getProfiles();
      const target = profiles.find(p => p.id === profile.id);
      if (target) {
        target.serverId = res.data.profile.id;
        saveProfiles(profiles);
      }
      return res.data.profile;
    }
    return null;
  }).catch(() => null);
}

/** 删除服务端档案（静默失败） */
function removeProfileFromServer(profile) {
  if (!isLoggedIn() || !profile.serverId) return Promise.resolve();
  return request({
    url: `/api/user/birth-profiles/${profile.serverId}`,
    method: 'DELETE'
  }).catch(() => null);
}

/** 从服务端拉取档案并与本地合并（以服务端为准） */
function syncFromServer() {
  if (!isLoggedIn()) return Promise.resolve(getProfiles());
  return request({ url: '/api/user/birth-profiles' })
    .then(res => {
      if (!res || res.code !== 0 || !Array.isArray(res.data && res.data.profiles)) {
        return getProfiles();
      }
      const serverList = res.data.profiles.map(sp => ({
        id: `server-${sp.id}`,
        serverId: sp.id,
        name: sp.name || '未命名',
        gender: sp.gender === 2 ? 'female' : 'male',
        birthday: sp.birthday,
        birthTime: sp.birthTime,
        createdAt: sp.createdAt ? new Date(sp.createdAt).getTime() : 0
      }));
      // 本地尚未成功推送的档案保留，按 (birthday+birthTime) 去重
      const merged = [...serverList];
      getProfiles().forEach(lp => {
        const exists = merged.some(m => m.birthday === lp.birthday && m.birthTime === lp.birthTime);
        if (!exists) merged.push(lp);
      });
      saveProfiles(merged.slice(0, MAX_PROFILES));
      return getProfiles();
    })
    .catch(() => getProfiles());
}

module.exports = {
  MAX_PROFILES,
  getProfiles,
  getActiveProfile,
  setActiveProfile,
  addProfile,
  removeProfile,
  isLoggedIn,
  pushProfileToServer,
  removeProfileFromServer,
  syncFromServer
};
