package com.saas.tenant.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * Vapi.ai Assistant Entity (Tenant Entity)
 * 
 * Vapi.ai voice assistant configurations per tenant
 * - Stored in tenant-specific database (tenant_X) for physical isolation
 * - NO tenantId field needed (database-per-tenant architecture)
 * - Hibernate auto-DDL creates/updates schema automatically
 * 
 * Migration from admin/entity:
 * - Moved from admin database (saas_db) to tenant databases (tenant_X)
 * - Removed tenantId field (physical isolation)
 * - Synced to admin cache (AdminVapiAssistantSummary) for cross-tenant provisioning
 * 
 * Architecture:
 * - Each tenant manages their own assistants
 * - Provider integration: Creates/updates assistants via Vapi.ai REST API
 * - Call routing: Phone numbers are linked to specific assistants via vapiAssistantId
 */
@Entity
@Table(name = "vapi_assistants", 
       indexes = {
           @Index(name = "idx_vapi_assistant_vapi_id", columnList = "vapi_assistant_id"),
           @Index(name = "idx_vapi_assistant_created_at", columnList = "created_at")
       })
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VapiAssistant {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "vapi_assistant_id", unique = true, length = 200)
    private String vapiAssistantId;
    
    @Column(name = "name", nullable = false, length = 200)
    private String name;
    
    @Column(name = "model", nullable = false, length = 100)
    @Builder.Default
    private String model = "gpt-4";
    
    @Column(name = "voice", nullable = false, length = 100)
    @Builder.Default
    private String voice = "11labs-rachel";
    
    @Column(name = "prompt", columnDefinition = "TEXT")
    private String prompt;
    
    @Column(name = "first_message", columnDefinition = "TEXT")
    private String firstMessage;
    
    @Column(name = "server_url", length = 500)
    private String serverUrl;
    
    @Column(name = "server_url_secret", length = 200)
    private String serverUrlSecret;
    
    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "config", columnDefinition = "JSON")
    private Map<String, Object> config;
    
    @Column(name = "status", length = 50)
    @Builder.Default
    private String status = "ACTIVE";
    
    @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();
    }
}
