/**
 * Blogger Account Model
 *
 * Stores per-admin Google/Blogger connections for the Blogger integration.
 * Mirrors FacebookAccount/WhatsAppConnection: a BloggerAccount is scoped to
 * (companyId, userId, googleUserId) so each admin connects and manages their
 * own Google/Blogger account independently — no cross-admin access.
 *
 * Google OAuth 2.0 returns both an access token (short-lived, ~1 hour) and a
 * refresh token (long-lived, until revoked or 6 months inactive). Both are
 * encrypted at rest (AES-256-GCM via services/utils/encryption) and excluded
 * from queries by default (select:false).
 *
 * Each admin may own multiple blogs; the selected default blog for publishing
 * is stored as defaultBlogId.
 */

import mongoose, { Schema, Document } from 'mongoose';

// ============================================
// TYPE DEFINITIONS
// ============================================

export type BloggerAccountStatus = 'connected' | 'reconnect_required' | 'revoked';

export interface IBloggerBlog {
  blogId: string;
  blogName: string;
  blogUrl: string;
}

export interface IBloggerAccount extends Document {
  companyId: string;
  userId: string; // owning admin — all access is scoped to this user
  googleUserId: string; // Google user ID (sub claim from userinfo)
  googleUserName?: string; // Google display name
  googleUserEmail?: string; // Google email address
  googleUserPicture?: string; // Google profile picture URL
  // Selected default blog for publishing
  defaultBlogId: string;
  defaultBlogName: string;
  defaultBlogUrl?: string;
  // All available blogs from this Google account (for blog selection UI)
  availableBlogs?: IBloggerBlog[];
  // Encrypted token material — never returned by default queries
  encryptedAccessToken?: string;
  accessTokenIV?: string;
  encryptedRefreshToken?: string;
  refreshTokenIV?: string;
  tokenExpiresAt?: Date; // access token expiration (typically ~1 hour)
  scope: string;
  status: BloggerAccountStatus;
  isDemo: boolean;
  connectedAt: Date;
  lastUsedAt?: Date;
  lastSyncedAt?: Date; // last time blogs were synced from Google
  createdAt: Date;
  updatedAt: Date;
}

// ============================================
// MAIN SCHEMA
// ============================================

const BloggerBlogSchema = new Schema<IBloggerBlog>({
  blogId: { type: String, required: true },
  blogName: { type: String, required: true },
  blogUrl: { type: String, default: '' },
}, { _id: false });

const BloggerAccountSchema = new Schema<IBloggerAccount>({
  companyId: {
    type: String,
    required: [true, 'Company ID is required'],
    index: true,
  },
  userId: {
    type: String,
    required: [true, 'User ID is required'],
    index: true,
  },
  googleUserId: {
    type: String,
    required: [true, 'Google user ID is required'],
  },
  googleUserName: {
    type: String,
    default: '',
  },
  googleUserEmail: {
    type: String,
    default: '',
  },
  googleUserPicture: {
    type: String,
    default: '',
  },
  // Selected default blog for publishing
  defaultBlogId: {
    type: String,
    required: [true, 'Default blog ID is required'],
  },
  defaultBlogName: {
    type: String,
    required: [true, 'Default blog name is required'],
  },
  defaultBlogUrl: {
    type: String,
    default: '',
  },
  // All available blogs from this Google account
  availableBlogs: {
    type: [BloggerBlogSchema],
    default: [],
  },
  // Encrypted token material — never returned by default queries
  encryptedAccessToken: {
    type: String,
    select: false,
  },
  accessTokenIV: {
    type: String,
    select: false,
  },
  encryptedRefreshToken: {
    type: String,
    select: false,
  },
  refreshTokenIV: {
    type: String,
    select: false,
  },
  tokenExpiresAt: {
    type: Date,
    default: null,
  },
  scope: {
    type: String,
    default: '',
  },
  status: {
    type: String,
    enum: ['connected', 'reconnect_required', 'revoked'],
    default: 'connected',
  },
  isDemo: {
    type: Boolean,
    default: false,
  },
  connectedAt: {
    type: Date,
    default: Date.now,
  },
  lastUsedAt: {
    type: Date,
    default: null,
  },
  lastSyncedAt: {
    type: Date,
    default: null,
  },
}, {
  timestamps: true,
});

// ============================================
// INDEXES
// ============================================

// One connection per admin per Google user per company — the isolation anchor
BloggerAccountSchema.index({ companyId: 1, userId: 1, googleUserId: 1 }, { unique: true });
BloggerAccountSchema.index({ companyId: 1, userId: 1 });

// ============================================
// EXPORT
// ============================================

export const BloggerAccount = mongoose.models.BloggerAccount || mongoose.model<IBloggerAccount>('BloggerAccount', BloggerAccountSchema);