package com.saas.admin.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.Map;

/**
 * Vapi.ai Call Cost Record
 * 
 * Tracks costs for Vapi.ai calls separate from AI API costs
 * - Stored in admin database (saas_db) for centralized cost tracking
 * - Links to VapiCall via vapiCallId
 * - Vapi.ai pricing: $0.13-0.31 per minute (depends on model + voice provider)
 * 
 * Architecture:
 * - Separate from AiApiCostRecord (different cost domain)
 * - Enables granular cost analysis per tenant
 * - Cost breakdown: transport, transcriber, model, voice
 */
@Entity
@Table(name = "vapi_call_cost_records", 
       indexes = {
           @Index(name = "idx_vapi_cost_call", columnList = "vapi_call_id"),
           @Index(name = "idx_vapi_cost_tenant", columnList = "tenant_id"),
           @Index(name = "idx_vapi_cost_created_at", columnList = "created_at")
       })
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VapiCallCostRecord {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    /**
     * Vapi Call ID (links to VapiCall.vapiCallId)
     */
    @Column(name = "vapi_call_id", nullable = false, length = 200)
    private String vapiCallId;
    
    /**
     * Tenant ID for multi-tenant cost filtering
     */
    @Column(name = "tenant_id", nullable = false, length = 100)
    private String tenantId;
    
    /**
     * Provider (always "VAPI")
     */
    @Column(name = "provider", nullable = false, length = 50)
    @Builder.Default
    private String provider = "VAPI";
    
    /**
     * Call duration in minutes (decimal)
     */
    @Column(name = "duration_minutes", precision = 10, scale = 4)
    private BigDecimal durationMinutes;
    
    /**
     * Cost per minute (USD)
     * Vapi.ai range: $0.13-0.31/min
     */
    @Column(name = "cost_per_minute", precision = 10, scale = 6)
    private BigDecimal costPerMinute;
    
    /**
     * Total call cost (USD)
     */
    @Column(name = "total_cost", precision = 10, scale = 6, nullable = false)
    private BigDecimal totalCost;
    
    /**
     * Currency (default: USD)
     */
    @Column(name = "currency", length = 3, nullable = false)
    @Builder.Default
    private String currency = "USD";
    
    /**
     * Cost breakdown (JSON)
     * 
     * Example:
     * {
     *   "transport": 0.02,
     *   "transcriber": 0.05,
     *   "model": 0.15,
     *   "voice": 0.08,
     *   "total": 0.30
     * }
     */
    @JdbcTypeCode(SqlTypes.JSON)
    @Column(name = "cost_breakdown", columnDefinition = "JSON")
    private Map<String, Object> costBreakdown;
    
    /**
     * Call timing
     */
    @Column(name = "call_start_time")
    private LocalDateTime callStartTime;
    
    @Column(name = "call_end_time")
    private LocalDateTime callEndTime;
    
    /**
     * Call metadata for reference
     */
    @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;
    
    /**
     * 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();
    }
}
