package com.arena.combat.entity;

import com.arena.combat.entity.enums.EstadoPartida;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

@Entity
@Table(name = "partidas_combate", indexes = {
    @Index(name = "idx_partidas_usuario", columnList = "usuario_id"),
    @Index(name = "idx_partidas_estado", columnList = "estado")
})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PartidaCombate {

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

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "usuario_id", nullable = false)
    private Usuario usuario;

    @Column(name = "nombre_jefe", nullable = false, length = 100)
    private String nombreJefe;

    @Column(name = "tipo_jefe", nullable = false, length = 50)
    @Builder.Default
    private String tipoJefe = "DRAGON_SOMBRA";

    @Column(name = "hp_max_heroe", nullable = false)
    private Integer hpMaxHeroe;

    @Column(name = "hp_actual_heroe", nullable = false)
    private Integer hpActualHeroe;

    @Column(name = "mp_max_heroe", nullable = false)
    private Integer mpMaxHeroe;

    @Column(name = "mp_actual_heroe", nullable = false)
    private Integer mpActualHeroe;

    @Column(name = "hp_max_jefe", nullable = false)
    private Integer hpMaxJefe;

    @Column(name = "hp_actual_jefe", nullable = false)
    private Integer hpActualJefe;

    @Column(name = "turno_actual", nullable = false)
    @Builder.Default
    private Integer turnoActual = 1;

    @Column(name = "pociones_hp_restantes", nullable = false)
    @Builder.Default
    private Integer pocionesHpRestantes = 3;

    @Column(name = "pociones_mp_restantes", nullable = false)
    @Builder.Default
    private Integer pocionesMpRestantes = 2;

    @Column(name = "en_defensa", nullable = false)
    @Builder.Default
    private Boolean enDefensa = false;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false, length = 30)
    @Builder.Default
    private EstadoPartida estado = EstadoPartida.EN_CURSO;

    @Column(name = "dano_total_infligido", nullable = false)
    @Builder.Default
    private Integer danoTotalInfligido = 0;

    @Column(name = "dano_total_recibido", nullable = false)
    @Builder.Default
    private Integer danoTotalRecibido = 0;

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

    @UpdateTimestamp
    @Column(name = "updated_at", nullable = false)
    private LocalDateTime updatedAt;

    public boolean estaTerminada() {
        return this.estado != EstadoPartida.EN_CURSO;
    }
}
