/**
 * GMB Media Model
 * Google Business Profile media management with categories, tags, and featured status
 */

import mongoose, { Schema, Document } from 'mongoose';

// ============================================
// TYPE DEFINITIONS
// ============================================

export type GmbMediaType = 'photo' | 'video' | 'logo' | 'cover' | 'interior' | 'exterior' | 'team' | 'product' | 'other';
export type GmbMediaStatus = 'active' | 'archived' | 'processing';

// ============================================
// MAIN INTERFACE
// ============================================

export interface IGmbMedia extends Document {
  // A. Core
  companyId: string;
  locationId: string;
  name: string;
  type: GmbMediaType;
  url: string;

  // B. File Details
  thumbnailUrl?: string;
  fileSize?: number;
  fileType?: string;
  dimensions: Record<string, unknown>;

  // C. Metadata
  description?: string;
  altText?: string;
  tags: string[];
  category?: string;

  // D. Status
  status: GmbMediaStatus;
  isFeatured: boolean;
  uploadedAt?: Date;

  // Timestamps
  createdAt: Date;
  updatedAt: Date;
}

// ============================================
// MAIN SCHEMA
// ============================================

const GmbMediaSchema = new Schema<IGmbMedia>({
  // A. Core
  companyId: {
    type: String,
    required: [true, 'Company ID is required'],
    index: true
  },
  locationId: {
    type: String,
    required: [true, 'Location ID is required'],
    index: true
  },
  name: {
    type: String,
    required: [true, 'Media name is required'],
    trim: true
  },
  type: {
    type: String,
    enum: ['photo', 'video', 'logo', 'cover', 'interior', 'exterior', 'team', 'product', 'other'],
    default: 'photo'
  },
  url: {
    type: String,
    required: [true, 'Media URL is required']
  },

  // B. File Details
  thumbnailUrl: String,
  fileSize: Number,
  fileType: String,
  dimensions: {
    type: Schema.Types.Mixed,
    default: {}
  },

  // C. Metadata
  description: String,
  altText: String,
  tags: [String],
  category: String,

  // D. Status
  status: {
    type: String,
    enum: ['active', 'archived', 'processing'],
    default: 'active'
  },
  isFeatured: {
    type: Boolean,
    default: false
  },
  uploadedAt: Date

}, {
  timestamps: true
});

// ============================================
// INDEXES
// ============================================

GmbMediaSchema.index({ companyId: 1 });
GmbMediaSchema.index({ locationId: 1 });
GmbMediaSchema.index({ type: 1 });

// ============================================
// EXPORT
// ============================================

export const GmbMedia = mongoose.models.GmbMedia || mongoose.model<IGmbMedia>('GmbMedia', GmbMediaSchema);