// pages/login/profile-page.js
const formatUtil = require("../../utils/formatDate.js");
const { calculateConstellationFromBirthday } = require("../../utils/formatDate.js");
const redirect = require("../../utils/redirect.js");
const apiClient = require('../../utils/api-client.js');
const imageCacheManager = require('../../utils/image-cache-manager.js');
const cosManager = require('../../utils/cos-manager.js');
const nimUserManager = require('../../utils/nim-user-manager.js');
const config = require('../../config/config.js');
const app = getApp()
Page({
  /**
   * 页面的初始数据
   */
  data: {
    avatar: '',
    currentDate: new Date().getTime(),
    endDate: formatUtil.formatDate(formatUtil.getNYearsAgo(18)),
    gender: "man",
    nickname: '',
    isnickNameError: '',
    birthDate: formatUtil.formatDate(formatUtil.getNYearsAgo(18)),
    age: ''
  },

  genderBtn(e) {
    const gender = e.currentTarget.dataset.value;
    this.setData({ gender });
  },
  nicknameInput(e) {
    const newValue = e.detail.value;
    this.checkInvalidChars(newValue);
    this.setData({ nickname: newValue });
  },
  
  checkInvalidChars(value) {
    // 匹配英文、中文、数字之外的字符
    const invalidReg = /[^\a-zA-Z0-9\u4e00-\u9fa5]/g;
    const hasInvalid = invalidReg.test(value);
    
    this.setData({
      showTip: hasInvalid,
      nickNameError: hasInvalid ? '支持文字、字母、数字输入' : '',
      isnickNameError: hasInvalid
    });
  },
  bindDateChange(e) {
    const birthDate = e.detail.value;
    this.setData({
      birthDate,
      age: formatUtil.calculateAge(birthDate) + '岁'
    });
  },
  async onChooseAvatar(e) {
    try {
      const { avatarUrl } = e.detail;
      console.log('用户选择头像，临时路径:', avatarUrl);
      // 直接保存路径，上传时再验证（避免重复验证）
      this.setData({ avatar: avatarUrl });
    } catch (error) {
      console.error('❌ 选择头像失败:', error);
      wx.showToast({
        title: '选择头像失败，请重试',
        icon: 'none',
        duration: 2000
      });
    }
  },

  // 上传头像到服务器（参考 profile.js 的实现）
  async uploadAvatarToServer(tempFilePath) {
    console.log('📤 开始上传头像，路径:', tempFilePath);
    
    if (!tempFilePath) {
      throw new Error('头像路径为空，请重新选择头像');
    }
    
    // 验证文件路径是否可用
    try {
      await new Promise((resolve, reject) => {
        wx.getFileInfo({
          filePath: tempFilePath,
          success: (res) => {
            console.log('✅ 文件信息验证成功，大小:', res.size);
            resolve();
          },
          fail: (err) => {
            console.error('❌ 文件路径验证失败:', err);
            reject(new Error('文件路径无效或文件不存在，请重新选择头像'));
          }
        });
      });
    } catch (error) {
      console.error('❌ 验证文件失败:', error);
      throw error;
    }
    
    // 使用 COS 管理器上传头像（支持压缩、去重等功能）
    const uploadResult = await cosManager.upload(tempFilePath, {
      fileType: 'avatar',
      enableDedup: true,
      onProgress: (percent) => {
        console.log('上传进度:', percent + '%');
      },
      enableCompress: false,
      compressOptions: {
        maxWidth: 400,
        maxHeight: 400,
        targetSize: 30 * 1024
      }
    });

    // 检查上传结果
    if (!uploadResult || !uploadResult.success || !uploadResult.fileUrl) {
      const errorMsg = uploadResult?.error || uploadResult?.message || '上传失败：未获取到文件URL';
      console.error('❌ 上传结果异常:', uploadResult);
      throw new Error(errorMsg);
    }

    const avatarUrl = uploadResult.fileUrl;
    console.log('✅ 头像上传成功，URL:', avatarUrl);

    // 更新全局用户信息
    if (app.globalData.userInfo?.user) {
      app.globalData.userInfo.user.avatar = avatarUrl;
    }

    // 同步到 NIM 和业务后端（静默处理，失败不影响主流程）
    Promise.all([
      nimUserManager.updateSelfUserInfo({ avatar: avatarUrl }).catch(err => 
        console.error('⚠️ 同步头像到 NIM 失败:', err)
      ),
      apiClient.updateUserProfile({ avatar: avatarUrl }).catch(err => 
        console.error('⚠️ 同步头像到后端失败:', err)
      )
    ]).then(() => {
      console.log('✅ 头像已同步到 NIM 和业务后端');
    });

    return avatarUrl;
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: async function (options) {
    // 应用屏幕适配到页面的数据
    await app.initScreen(this);

    // 预填用户信息（从登录数据中获取）
    this.preFillUserInfo();
  },

  /**
   * 预填用户信息到表单
   */
  preFillUserInfo() {
    // 优先从全局数据获取
    let profileData = app?.globalData?.profilePreFillData;
    
    // 如果全局数据没有，从本地存储获取
    if (!profileData) {
      try {
        profileData = wx.getStorageSync('profilePreFillData');
      } catch (e) {
        console.warn('从本地存储获取数据失败:', e);
      }
    }

    // 如果还是没有，尝试从 userInfo 中获取
    if (!profileData) {
      try {
        const userInfo = wx.getStorageSync('userInfo');
        if (userInfo?.user) {
          profileData = {
            nickname: userInfo.user.nickname || userInfo.user.nickName || '',
            avatar: userInfo.user.avatar || userInfo.user.avatarUrl || '',
            gender: this.mapGenderToProfileFormat(userInfo.user.gender)
          };
        }
      } catch (e) {
        console.warn('从userInfo获取数据失败:', e);
      }
    }

    // 如果有数据，预填到表单
    if (profileData) {
      const updateData = {};
      if (profileData.nickname) updateData.nickname = profileData.nickname;
      if (profileData.avatar) updateData.avatar = profileData.avatar;
      if (profileData.gender) updateData.gender = profileData.gender;

      if (Object.keys(updateData).length > 0) {
        this.setData(updateData);
        console.log('✅ 已预填用户信息:', updateData);
      }

      // 清除临时数据
      try {
        app.globalData.profilePreFillData = null;
        wx.removeStorageSync('profilePreFillData');
      } catch (e) {
        console.warn('清除临时数据失败:', e);
      }
    }
  },

  /**
   * 将后端性别格式转换为 profile-page 需要的格式
   * @param {number|string} gender - 后端返回的性别：0-未知，1-男，2-女，3-其他
   * @returns {string} 'man' 或 'woman'
   */
  mapGenderToProfileFormat(gender) {
    if (gender === 1 || gender === '1' || gender === 'man' || gender === 'male') {
      return 'man';
    } else if (gender === 2 || gender === '2' || gender === 'woman' || gender === 'female') {
      return 'woman';
    }
    return 'man'; // 默认返回 'man'
  },
  
  /**
   * 判断是否为临时文件路径
   */
  isTempFilePath(path) {
    if (!path) return false;
    return path.startsWith('wxfile://') || 
           path.startsWith('http://tmp/') || 
           path.startsWith('tmp/') ||
           (!path.startsWith('http://') && !path.startsWith('https://'));
  },

  async putProFile() {
    const { nickname, gender, birthDate, avatar } = this.data;
    
    // 验证昵称
    if (!nickname) {
      wx.showToast({ title: '请填写个人信息', icon: 'error' });
      return;
    }

    const invalidReg = /[^\a-zA-Z0-9\u4e00-\u9fa5]/g;
    if (invalidReg.test(nickname)) {
      wx.showToast({ title: '支持文字、字母、数字输入', icon: 'error' });
      return;
    }

    wx.showLoading({ title: '提交中...', mask: true });

    try {
      // 处理头像上传
      let avatarUrl = avatar;
      const isTempPath = avatar && (
        avatar.startsWith('wxfile://') || 
        avatar.startsWith('http://tmp/') || 
        avatar.startsWith('tmp/') ||
        (!avatar.startsWith('http://') && !avatar.startsWith('https://'))
      );
      
      if (isTempPath) {
        console.log('开始上传头像到服务器，临时路径:', avatar);
        wx.showLoading({ title: '上传头像中...', mask: true });
        try {
          avatarUrl = await this.uploadAvatarToServer(avatar);
          this.setData({ avatar: avatarUrl });
          console.log('✅ 头像上传成功，URL:', avatarUrl);
        } catch (uploadError) {
          console.error('❌ 头像上传失败:', uploadError);
          wx.hideLoading();
          wx.showToast({
            title: uploadError.message || '头像上传失败，请重试',
            icon: 'none',
            duration: 3000
          });
          return; // 上传失败，停止提交
        }
      }

      // 根据生日计算星座
      const zodiacSign = birthDate ? calculateConstellationFromBirthday(birthDate) : '';
      
      // 提交用户信息到后台
      await apiClient.updateUserProFileInfo(
        nickname, 
        gender == 'man' ? 1 : 2, 
        birthDate || undefined,
        avatarUrl || undefined,
        zodiacSign || undefined
      );
      // 保存成功后更新全局用户信息
      if (app.globalData.userInfo) {
        // 更新全局用户信息
        if (!app.globalData.userInfo.user) {
          app.globalData.userInfo.user = {};
        }
        app.globalData.userInfo.user.nickname = nickname;
        app.globalData.userInfo.user.gender = gender == 'man' ? 1 : 2;
        if (birthDate) {
          app.globalData.userInfo.user.birthday = birthDate;
        }
        if (avatarUrl) {
          app.globalData.userInfo.user.avatar = avatarUrl;
        }
        if (zodiacSign) {
          app.globalData.userInfo.user.zodiacSign = zodiacSign;
        }

        // 同时更新本地存储
        try {
          wx.setStorageSync('userInfo', app.globalData.userInfo);
          console.log('✅ 全局用户信息已更新');
        } catch (e) {
          console.warn('更新本地存储失败:', e);
        }
      }
      wx.hideLoading();
      redirect.goMain();
    } catch (error) {
      wx.hideLoading();
      console.error('提交失败:', error);
      wx.showToast({
        title: error.message || '提交失败，请重试',
        icon: 'error',
        duration: 3000
      });
    }
  }
})
