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.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * Vapi.ai Call Entity (Tenant Entity)
 * 
 * Call history from Vapi.ai voice assistants 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)
 * - Populated via webhooks (end-of-call-report) from Vapi.ai
 * 
 * Architecture:
 * - Linked to VapiAssistant via assistantId
 * - Linked to VapiCallCostRecord for detailed cost tracking
 * - Contains transcript, cost, and call metadata
 */
@Entity
@Table(name = "vapi_calls", 
       indexes = {
           @Index(name = "idx_vapi_call_assistant", columnList = "assistant_id"),
           @Index(name = "idx_vapi_call_vapi_id", columnList = "vapi_call_id"),
           @Index(name = "idx_vapi_call_status", columnList = "status"),
           @Index(name = "idx_vapi_call_created_at", columnList = "created_at")
       })
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VapiCall {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "vapi_call_id", unique = true, length = 200)
    private String vapiCallId;
    
    @Column(name = "assistant_id", length = 200)
    private String assistantId;
    
    @Column(name = "phone_number", length = 50)
    private String phoneNumber;
    
    @Column(name = "customer_number", length = 50)
    private String customerNumber;
    
    @Column(name = "call_type", length = 20)
    @Builder.Default
    private String callType = "OUTBOUND";
    
    @Column(name = "status", length = 50)
    @Builder.Default
    private String status = "queued";
    
    @Column(name = "end_reason", length = 100)
    private String endReason;
    
    @Column(name = "start_time")
    private LocalDateTime startTime;
    
    @Column(name = "end_time")
    private LocalDateTime endTime;
    
    @Column(name = "duration")
    private Integer duration;
    
    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "transcript", columnDefinition = "JSON")
    private List<Map<String, Object>> transcript;
    
    @Column(name = "recording_url", length = 500)
    private String recordingUrl;
    
    @Column(name = "cost", precision = 10, scale = 6)
    private BigDecimal cost;
    
    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "cost_breakdown", columnDefinition = "JSON")
    private Map<String, Object> costBreakdown;
    
    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "analysis", columnDefinition = "JSON")
    private Map<String, Object> analysis;
    
    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "webhook_payload", columnDefinition = "JSON")
    private Map<String, Object> webhookPayload;
    
    @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();
    }
}
