/**
 * 乘车人管理工具类
 * 实现乘车人数据的增删改查和数据同步
 */

class PassengerService {
  constructor() {
    this.listeners = []; // 数据变化监听器
    this.initPassengerData();
  }

  // 初始化乘车人数据
  initPassengerData() {
    const passengers = this.getAllPassengers();
    if (passengers.length === 0) {
      // 初始化示例数据
      const samplePassengers = [];
      this.savePassengers(samplePassengers);
    }
  }

  // 获取所有乘车人
  getAllPassengers() {
    try {
      return wx.getStorageSync('passengers') || [];
    } catch (error) {
      console.error('获取乘车人数据失败:', error);
      return [];
    }
  }

  // 保存乘车人列表
  savePassengers(passengers) {
    try {
      wx.setStorageSync('passengers', passengers);
      this.notifyListeners(passengers);
      return true;
    } catch (error) {
      console.error('保存乘车人数据失败:', error);
      return false;
    }
  }

  // 添加乘车人
  addPassenger(passenger) {
    // 验证必填字段
    if (!passenger.name || !passenger.idcard || !passenger.phone) {
      throw new Error('姓名、证件号码和手机号不能为空');
    }

    // 验证手机号格式
    if (!/^1[3-9]\d{9}$/.test(passenger.phone)) {
      throw new Error('请输入正确的手机号码');
    }

    // 验证身份证号格式（简单验证）
    if (passenger.idtype === '身份证' && !/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(passenger.idcard)) {
      throw new Error('请输入正确的身份证号码');
    }

    const passengers = this.getAllPassengers();
    
    // 检查是否已存在相同证件号的乘车人
    const existingPassenger = passengers.find(p => p.idcard === passenger.idcard);
    if (existingPassenger) {
      throw new Error('该证件号码已存在');
    }

    // 生成唯一ID
    const newPassenger = {
      ...passenger,
      id: this.generateId(),
      createTime: new Date().toISOString(),
      updateTime: new Date().toISOString()
    };

    passengers.push(newPassenger);
    
    if (this.savePassengers(passengers)) {
      return newPassenger;
    } else {
      throw new Error('保存乘车人失败');
    }
  }

  // 更新乘车人
  updatePassenger(id, updatedData) {
    const passengers = this.getAllPassengers();
    const index = passengers.findIndex(p => p.id === id);
    
    if (index === -1) {
      throw new Error('乘车人不存在');
    }

    // 验证必填字段
    if (!updatedData.name || !updatedData.idcard || !updatedData.phone) {
      throw new Error('姓名、证件号码和手机号不能为空');
    }

    // 验证手机号格式
    if (!/^1[3-9]\d{9}$/.test(updatedData.phone)) {
      throw new Error('请输入正确的手机号码');
    }

    // 检查证件号是否与其他乘车人重复
    const existingPassenger = passengers.find(p => p.id !== id && p.idcard === updatedData.idcard);
    if (existingPassenger) {
      throw new Error('该证件号码已存在');
    }

    passengers[index] = {
      ...passengers[index],
      ...updatedData,
      updateTime: new Date().toISOString()
    };

    if (this.savePassengers(passengers)) {
      return passengers[index];
    } else {
      throw new Error('更新乘车人失败');
    }
  }

  // 删除乘车人
  deletePassenger(id) {
    const passengers = this.getAllPassengers();
    const filteredPassengers = passengers.filter(p => p.id !== id);
    
    if (filteredPassengers.length === passengers.length) {
      throw new Error('乘车人不存在');
    }

    if (this.savePassengers(filteredPassengers)) {
      return true;
    } else {
      throw new Error('删除乘车人失败');
    }
  }

  // 根据ID获取乘车人
  getPassengerById(id) {
    const passengers = this.getAllPassengers();
    return passengers.find(p => p.id === id) || null;
  }

  // 搜索乘车人
  searchPassengers(keyword) {
    const passengers = this.getAllPassengers();
    if (!keyword) return passengers;
    
    const lowerKeyword = keyword.toLowerCase();
    return passengers.filter(p => 
      p.name.toLowerCase().includes(lowerKeyword) ||
      p.phone.includes(keyword) ||
      p.idcard.includes(keyword)
    );
  }

  // 获取常用乘车人（按使用频率排序）
  getFrequentPassengers(limit = 5) {
    const passengers = this.getAllPassengers();
    // 按创建时间倒序，实际项目中可以按使用频率排序
    return passengers
      .sort((a, b) => new Date(b.updateTime) - new Date(a.updateTime))
      .slice(0, limit);
  }

  // 批量选择乘车人（用于购票）
  selectPassengersForBooking(passengerIds) {
    const passengers = this.getAllPassengers();
    const selectedPassengers = passengers.filter(p => passengerIds.includes(p.id));
    
    // 验证所有ID都找到了对应的乘车人
    if (selectedPassengers.length !== passengerIds.length) {
      throw new Error('部分乘车人不存在');
    }

    return selectedPassengers;
  }

  // 生成唯一ID
  generateId() {
    return 'passenger_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
  }

  // 数据监听器管理
  addListener(callback) {
    this.listeners.push(callback);
  }

  removeListener(callback) {
    const index = this.listeners.indexOf(callback);
    if (index > -1) {
      this.listeners.splice(index, 1);
    }
  }

  notifyListeners(passengers) {
    this.listeners.forEach(callback => {
      try {
        callback(passengers);
      } catch (error) {
        console.error('乘车人数据监听器回调执行失败:', error);
      }
    });
  }

  // 导出乘车人数据（用于备份）
  exportPassengers() {
    return {
      passengers: this.getAllPassengers(),
      exportTime: new Date().toISOString(),
      version: '1.0.0'
    };
  }

  // 导入乘车人数据（用于恢复）
  importPassengers(data) {
    if (!data || !Array.isArray(data.passengers)) {
      throw new Error('导入数据格式错误');
    }

    try {
      this.savePassengers(data.passengers);
      return true;
    } catch (error) {
      console.error('导入乘车人数据失败:', error);
      throw new Error('导入乘车人数据失败');
    }
  }
}

// 创建单例实例
const passengerService = new PassengerService();

export default passengerService;

