package com.saas.subscription.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.math.BigDecimal;
import java.time.LocalDateTime;

@Entity
@Table(name = "subscription_plans")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SubscriptionPlan {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true, nullable = false)
    private String name; // STARTER, PRO, ENTERPRISE

    @Column(length = 1000)
    private String description;

    @Builder.Default
    @Column(name = "price_per_month", nullable = false)
    private BigDecimal pricePerMonth = BigDecimal.ZERO;

    // DEPRECATED: Exists only to satisfy DB Schema constraint (duplicate column)
    @Builder.Default
    @Column(name = "monthly_price", nullable = false)
    private BigDecimal monthlyPrice = BigDecimal.ZERO;

    @PrePersist
    @PreUpdate
    private void syncPrices() {
        if (this.pricePerMonth != null) {
            this.monthlyPrice = this.pricePerMonth;
        } else if (this.monthlyPrice != null) {
            this.pricePerMonth = this.monthlyPrice;
        }
    }

    @Builder.Default
    @Column(name = "price_per_year", nullable = false)
    private BigDecimal pricePerYear = BigDecimal.ZERO;

    @Column(nullable = false)
    private String currency = "EUR";

    // --- 📞 Communication Limits ---

    @Column(nullable = false)
    private Integer includedMinutes = 0; // Soft limit (Overage allowed)

    @Column(nullable = false, precision = 10, scale = 2)
    private BigDecimal overagePricePerMinute = BigDecimal.ZERO;

    @Builder.Default
    @Column(nullable = false)
    private Integer maxCallTransfers = 0; // Hard limit

    // --- 👥 Capacity Limits (Hard Limits) ---

    @Column(name = "stripe_product_id")
    private String stripeProductId;

    @Column(name = "stripe_price_id")
    private String stripePriceId;

    @Builder.Default
    @Column(nullable = false)
    private Integer maxUsers = 1;

    @Builder.Default
    @Column(nullable = false)
    private Integer maxActiveAiAgents = 1;

    @Builder.Default
    @Column(nullable = false)
    private Integer maxStorageGb = 1;

    // --- 💾 Data & Retention ---

    @Builder.Default
    @Column(nullable = false)
    private Integer callHistoryRetentionDays = 30;

    @Builder.Default
    @Column(nullable = false)
    private Integer recordingRetentionMonths = 1;

    @Builder.Default
    @Column(nullable = false)
    private Integer maxRecordingRetrievalsPerMonth = 100;

    // --- 📊 Features ---

    @Builder.Default
    @Column(nullable = false)
    private boolean advancedAnalytics = false;

    @Builder.Default
    @Column(nullable = false)
    private boolean featuresEmailSupport = false;

    @Builder.Default
    @Column(nullable = false)
    private boolean featuresPrioritySupport = false;

    @Builder.Default
    @Column(nullable = false)
    private boolean featuresApiAccess = false;

    @Builder.Default
    @Column(nullable = false)
    private boolean featuresCustomDomain = false;

    @Builder.Default
    @Column(nullable = false)
    private boolean featuresSso = false;

    @Builder.Default
    @Column(nullable = false)
    private boolean featuresAuditLogs = false;

    @Builder.Default
    @Column(nullable = false)
    private String supportLevel = "STANDARD"; // STANDARD, PRIORITY, DEDICATED

    @Builder.Default
    @Column(nullable = false)
    private boolean active = true;

    @CreationTimestamp
    @Column(nullable = false, updatable = false)
    private LocalDateTime createdAt;

    @UpdateTimestamp
    private LocalDateTime updatedAt;
}
