package com.saas.admin.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * Admin Vapi Assistant Summary (Cache Table)
 * 
 * Denormalized cache of Vapi assistants across all tenants
 * - Stored in admin database (saas_db) for cross-tenant provisioning
 * - Synced every 5 minutes from tenant databases via AdminVapiSyncService
 * - Used for PhoneNumber provisioning (admin assigns assistants to phone numbers)
 * 
 * Architecture Decision:
 * - PK = vapi_assistant_id (String) to avoid ID collisions between tenants
 * - Each tenant's VapiAssistant has a unique vapi_assistant_id (Vapi.ai UUID)
 * - UPSERT logic (ON DUPLICATE KEY UPDATE) keeps cache fresh
 * 
 * Why String PK instead of Long?
 * - Tenant A: VapiAssistant id=1 (local), vapi_assistant_id="vapi_123"
 * - Tenant B: VapiAssistant id=1 (local), vapi_assistant_id="vapi_456"
 * - Using Long id=1 as PK → COLLISION ❌
 * - Using String vapi_assistant_id="vapi_123/456" as PK → NO COLLISION ✅
 */
@Entity
@Table(name = "admin_vapi_assistant_summary",
       indexes = {
           @Index(name = "idx_summary_tenant", columnList = "tenant_id"),
           @Index(name = "idx_summary_active", columnList = "is_active"),
           @Index(name = "idx_summary_synced", columnList = "last_synced_at")
       })
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AdminVapiAssistantSummary {
    
    /**
     * Primary Key: Vapi.ai Assistant ID (globally unique)
     * This is the UUID returned by Vapi.ai API, NOT the tenant-local database ID
     */
    @Id
    @Column(name = "vapi_assistant_id", length = 255)
    private String vapiAssistantId;
    
    /**
     * Tenant ID (which tenant owns this assistant)
     */
    @Column(name = "tenant_id", nullable = false, length = 100)
    private String tenantId;
    
    /**
     * Tenant-local ID (reference to tenant DB VapiAssistant.id)
     * Used for debugging and cross-reference
     */
    @Column(name = "tenant_local_id")
    private Long tenantLocalId;
    
    /**
     * Assistant name (user-defined)
     */
    @Column(name = "name", nullable = false, length = 200)
    private String name;
    
    /**
     * Voice provider (e.g., "11labs-rachel", "playht-jennifer")
     */
    @Column(name = "voice_provider", length = 100)
    private String voiceProvider;
    
    /**
     * Assistant status
     */
    @Column(name = "is_active")
    @Builder.Default
    private Boolean isActive = true;
    
    /**
     * Last sync timestamp (updated by AdminVapiSyncService)
     */
    @Column(name = "last_synced_at")
    private LocalDateTime lastSyncedAt;
    
    /**
     * Timestamps
     */
    @Column(name = "created_at", nullable = false, updatable = false)
    private LocalDateTime createdAt;
    
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
    
    @PrePersist
    protected void onCreate() {
        createdAt = LocalDateTime.now();
        updatedAt = LocalDateTime.now();
    }
    
    @PreUpdate
    protected void onUpdate() {
        updatedAt = LocalDateTime.now();
    }
}
