package pl.hackerspace.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.Set;

@Entity
@Table(name = "client")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Client {

    @Id
    private String nip;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String email;

    private String addressLine1;
    private String addressLine2;

    @Column(nullable = false)
    private String serviceName;

    @Column(nullable = false)
    private BigDecimal price;

    @Builder.Default
    @Column(nullable = false)
    private BigDecimal amount = BigDecimal.valueOf(1);

    @Builder.Default
    @Column(nullable = false)
    private BigDecimal vat = BigDecimal.valueOf(23);

    @Builder.Default
    @Column(nullable = false)
    private int paymentOffsetDays = 14;

    @Builder.Default
    private boolean subscriber = true;

    private boolean prepaid;

    @OneToMany(mappedBy="client")
    Set<Invoice> invoices;

    public byte[] getInvoiceForSubscriptionMonth(String monthOfInvoice) {
        return invoices.stream()
                .filter(i -> monthOfInvoice.equals(i.getMonthOfSubscription()))
                .map(Invoice::getPdfContent)
                .findFirst()
                .orElse(null);
    }
}
