const { DataTypes } = require('sequelize');
const { sequelize } = require('../config/database');

/**
 * Appointment Model
 * Represents user appointment bookings
 */
const Appointment = sequelize.define('Appointment', {
  id: {
    type: DataTypes.UUID,
    defaultValue: DataTypes.UUIDV4,
    primaryKey: true,
  },
  userId: {
    type: DataTypes.UUID,
    allowNull: false,
    field: 'user_id',
    references: {
      model: 'user',
      key: 'id',
    },
  },
  serviceId: {
    type: DataTypes.UUID,
    allowNull: true,
    field: 'service_id',
    references: {
      model: 'service',
      key: 'id',
    },
  },
  // 热门服务ID（用于从首页热门服务进入的预约）
  hotServiceId: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'hot_service_id',
  },
  // 服务类型
  serviceType: {
    type: DataTypes.STRING(50),
    allowNull: true,
    field: 'service_type',
    comment: '服务类型: travel, accommodation, guide, translation, consulting, other',
  },
  appointmentNo: {
    type: DataTypes.STRING(50),
    allowNull: false,
    unique: true,
    field: 'appointment_no',
  },
  realName: {
    type: DataTypes.STRING(100),
    allowNull: false,
    field: 'real_name',
  },
  contactMethod: {
    type: DataTypes.ENUM('phone', 'whatsapp', 'wechat'),
    allowNull: true,
    field: 'contact_method',
  },
  contactValue: {
    type: DataTypes.STRING(100),
    allowNull: true,
    field: 'contact_value',
  },
  // 多联系方式支持
  wechatId: {
    type: DataTypes.STRING(100),
    allowNull: true,
    field: 'wechat_id',
  },
  phone: {
    type: DataTypes.STRING(50),
    allowNull: true,
  },
  phoneCountryCode: {
    type: DataTypes.STRING(10),
    allowNull: true,
    field: 'phone_country_code',
  },
  whatsapp: {
    type: DataTypes.STRING(50),
    allowNull: true,
  },
  appointmentDate: {
    type: DataTypes.DATEONLY,
    allowNull: true,
    field: 'appointment_date',
  },
  appointmentTime: {
    type: DataTypes.TIME,
    allowNull: true,
    field: 'appointment_time',
  },
  notes: {
    type: DataTypes.TEXT,
    allowNull: true,
  },
  status: {
    type: DataTypes.ENUM('pending', 'confirmed', 'in-progress', 'completed', 'cancelled'),
    defaultValue: 'pending',
    allowNull: false,
  },
  amount: {
    type: DataTypes.DECIMAL(10, 2),
    allowNull: true,
  },
  paidAt: {
    type: DataTypes.DATE,
    allowNull: true,
    field: 'paid_at',
  },
  // ========== 机票预约专用字段 ==========
  // 行程类型: single-单程, round-往返
  tripType: {
    type: DataTypes.ENUM('single', 'round'),
    allowNull: true,
    field: 'trip_type',
  },
  // 出发日期
  departureDate: {
    type: DataTypes.DATEONLY,
    allowNull: true,
    field: 'departure_date',
  },
  // 返程日期
  returnDate: {
    type: DataTypes.DATEONLY,
    allowNull: true,
    field: 'return_date',
  },
  // 出发城市
  departureCity: {
    type: DataTypes.STRING(100),
    allowNull: true,
    field: 'departure_city',
  },
  // 到达城市
  arrivalCity: {
    type: DataTypes.STRING(100),
    allowNull: true,
    field: 'arrival_city',
  },
  // 成人人数
  adultCount: {
    type: DataTypes.INTEGER,
    allowNull: true,
    defaultValue: 0,
    field: 'adult_count',
  },
  // 儿童人数
  childCount: {
    type: DataTypes.INTEGER,
    allowNull: true,
    defaultValue: 0,
    field: 'child_count',
  },
  // 婴儿人数
  infantCount: {
    type: DataTypes.INTEGER,
    allowNull: true,
    defaultValue: 0,
    field: 'infant_count',
  },
  // 舱位类型: economy-经济舱, premium_economy-超级经济舱, business-商务舱
  cabinType: {
    type: DataTypes.ENUM('economy', 'premium_economy', 'business'),
    allowNull: true,
    field: 'cabin_type',
  },
  // 行李件数
  luggageCount: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'luggage_count',
  },
  // ========== 酒店预定专用字段 (Hotel Reservation) ==========
  // 入住日期
  checkInDate: {
    type: DataTypes.DATEONLY,
    allowNull: true,
    field: 'check_in_date',
  },
  // 退房日期
  checkOutDate: {
    type: DataTypes.DATEONLY,
    allowNull: true,
    field: 'check_out_date',
  },
  // 国家/城市
  countryCity: {
    type: DataTypes.STRING(200),
    allowNull: true,
    field: 'country_city',
  },
  // 酒店名称
  hotelName: {
    type: DataTypes.STRING(200),
    allowNull: true,
    field: 'hotel_name',
  },
  // 房间数量
  roomCount: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'room_count',
  },
  // 房间类型
  roomType: {
    type: DataTypes.STRING(100),
    allowNull: true,
    field: 'room_type',
  },
  // 是否需要餐食
  needMeal: {
    type: DataTypes.BOOLEAN,
    allowNull: true,
    field: 'need_meal',
  },
  // 餐食计划: breakfast-早餐, three_meals-三餐, all_inclusive-全包
  mealPlan: {
    type: DataTypes.ENUM('breakfast', 'three_meals', 'all_inclusive'),
    allowNull: true,
    field: 'meal_plan',
  },
  // ========== VIP贵宾室/接送机专用字段 ==========
  // 到达航班号
  arrivalFlightNo: {
    type: DataTypes.STRING(50),
    allowNull: true,
    field: 'arrival_flight_no',
  },
  // 出发航班号
  departureFlightNo: {
    type: DataTypes.STRING(50),
    allowNull: true,
    field: 'departure_flight_no',
  },
  // 机场/航站楼
  airportTerminal: {
    type: DataTypes.STRING(200),
    allowNull: true,
    field: 'airport_terminal',
  },
  // 送达地址
  deliveryAddress: {
    type: DataTypes.TEXT,
    allowNull: true,
    field: 'delivery_address',
  },
  // ========== 无成人陪伴儿童专用字段 ==========
  // 行程
  itinerary: {
    type: DataTypes.TEXT,
    allowNull: true,
  },
  // 儿童年龄
  childAge: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'child_age',
  },
  // 男孩数量
  boyCount: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'boy_count',
  },
  // 女孩数量
  girlCount: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'girl_count',
  },
  // ========== 高铁票代订专用字段 ==========
  // 出发站
  originStation: {
    type: DataTypes.STRING(100),
    allowNull: true,
    field: 'origin_station',
  },
  // 到达站
  destinationStation: {
    type: DataTypes.STRING(100),
    allowNull: true,
    field: 'destination_station',
  },
  // 座位等级: first-一等座, second-二等座, third-三等座
  seatClass: {
    type: DataTypes.ENUM('first', 'second', 'third'),
    allowNull: true,
    field: 'seat_class',
  },
  // 乘客数量
  passengerCount: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'passenger_count',
  },
  // ========== 医疗/特殊需求专用字段 ==========
  // 医院名称
  hospitalName: {
    type: DataTypes.STRING(200),
    allowNull: true,
    field: 'hospital_name',
  },
  // 病情描述
  conditionDescription: {
    type: DataTypes.TEXT,
    allowNull: true,
    field: 'condition_description',
  },
  // 特殊协助原因
  specialAssistanceReason: {
    type: DataTypes.TEXT,
    allowNull: true,
    field: 'special_assistance_reason',
  },
  // ========== 宠物托运专用字段 ==========
  // 出发地
  origin: {
    type: DataTypes.STRING(200),
    allowNull: true,
  },
  // 目的地
  destination: {
    type: DataTypes.STRING(200),
    allowNull: true,
  },
  // 航班号
  flightNo: {
    type: DataTypes.STRING(50),
    allowNull: true,
    field: 'flight_no',
  },
  // 宠物类型
  petType: {
    type: DataTypes.STRING(100),
    allowNull: true,
    field: 'pet_type',
  },
  // 宠物名称
  petName: {
    type: DataTypes.STRING(100),
    allowNull: true,
    field: 'pet_name',
  },
  // 是否有检疫证明
  hasQuarantineCert: {
    type: DataTypes.BOOLEAN,
    allowNull: true,
    field: 'has_quarantine_cert',
  },
  // ========== 导游/翻译服务专用字段 ==========
  // 服务天数
  serviceDays: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'service_days',
  },
  // ========== 咨询服务专用字段 ==========
  // 具体需求
  specificRequirements: {
    type: DataTypes.TEXT,
    allowNull: true,
    field: 'specific_requirements',
  },
  // ========== 物流专用字段 ==========
  // 物品名称
  itemName: {
    type: DataTypes.STRING(200),
    allowNull: true,
    field: 'item_name',
  },
  // 物品数量
  itemQuantity: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'item_quantity',
  },
  // 起运港
  originPort: {
    type: DataTypes.STRING(200),
    allowNull: true,
    field: 'origin_port',
  },
  // 目的港
  destinationPort: {
    type: DataTypes.STRING(200),
    allowNull: true,
    field: 'destination_port',
  },
  // 货物名称
  cargoName: {
    type: DataTypes.STRING(200),
    allowNull: true,
    field: 'cargo_name',
  },
  // 货物数量
  cargoQuantity: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'cargo_quantity',
  },
  // ========== 旅游规划专用字段 ==========
  // 出行日期
  travelDate: {
    type: DataTypes.DATEONLY,
    allowNull: true,
    field: 'travel_date',
  },
  // 旅游目的地
  travelDestination: {
    type: DataTypes.STRING(200),
    allowNull: true,
    field: 'travel_destination',
  },
  // 旅游天数
  travelDays: {
    type: DataTypes.INTEGER,
    allowNull: true,
    field: 'travel_days',
  },
}, {
  tableName: 'appointment',
  timestamps: true,
  underscored: true,
  indexes: [
    { fields: ['user_id'] },
    { fields: ['service_id'] },
    { fields: ['hot_service_id'] },
    { fields: ['appointment_no'] },
    { fields: ['status'] },
    { fields: ['appointment_date'] },
    { fields: ['departure_date'] },
    { fields: ['check_in_date'] },
    { fields: ['travel_date'] },
  ],
});

module.exports = Appointment;
