/**
 * GMB Review Model
 * Google Business Profile review management with replies and AI-suggested responses
 */

import mongoose, { Schema, Document } from 'mongoose';

// ============================================
// TYPE DEFINITIONS
// ============================================

export type ReplyStatus = 'new' | 'replied' | 'draft-reply' | 'flagged' | 'archived';

// ============================================
// MAIN INTERFACE
// ============================================

export interface IGmbReview extends Document {
  // A. Core
  companyId: string;
  locationId: string;

  // B. Reviewer Info
  reviewerName: string;
  reviewerAvatarUrl?: string;
  reviewerProfileUrl?: string;

  // C. Review Content
  rating: number;
  text?: string;
  reviewDate: string;
  reviewUrl?: string;

  // D. Reply
  replyText?: string;
  replyDate?: string;
  replyStatus: ReplyStatus;

  // E. AI Suggested Reply
  aiSuggestedReply?: string;

  // F. Moderation
  isFlagged: boolean;
  flagReason?: string;

  // G. Media
  reviewPhotos: string[];

  // H. Engagement
  helpfulCount: number;

  // Timestamps
  createdAt: Date;
  updatedAt: Date;
}

// ============================================
// MAIN SCHEMA
// ============================================

const GmbReviewSchema = new Schema<IGmbReview>({
  // A. Core
  companyId: {
    type: String,
    required: [true, 'Company ID is required'],
    index: true
  },
  locationId: {
    type: String,
    required: [true, 'Location ID is required'],
    index: true
  },

  // B. Reviewer Info
  reviewerName: {
    type: String,
    required: [true, 'Reviewer name is required']
  },
  reviewerAvatarUrl: String,
  reviewerProfileUrl: String,

  // C. Review Content
  rating: {
    type: Number,
    required: [true, 'Rating is required'],
    min: [1, 'Rating must be at least 1'],
    max: [5, 'Rating cannot exceed 5']
  },
  text: String,
  reviewDate: {
    type: String,
    required: [true, 'Review date is required']
  },
  reviewUrl: String,

  // D. Reply
  replyText: String,
  replyDate: String,
  replyStatus: {
    type: String,
    enum: ['new', 'replied', 'draft-reply', 'flagged', 'archived'],
    default: 'new'
  },

  // E. AI Suggested Reply
  aiSuggestedReply: String,

  // F. Moderation
  isFlagged: {
    type: Boolean,
    default: false
  },
  flagReason: String,

  // G. Media
  reviewPhotos: [String],

  // H. Engagement
  helpfulCount: {
    type: Number,
    default: 0
  }

}, {
  timestamps: true
});

// ============================================
// INDEXES
// ============================================

GmbReviewSchema.index({ companyId: 1 });
GmbReviewSchema.index({ locationId: 1 });
GmbReviewSchema.index({ rating: 1 });

// ============================================
// EXPORT
// ============================================

export const GmbReview = mongoose.models.GmbReview || mongoose.model<IGmbReview>('GmbReview', GmbReviewSchema);