import { ACCOUNT_STATUS, AccountStatus } from "./account-status";

describe("AccountStatus Value Object", () => {
  describe("Creación de estados válidos", () => {
    it("debería crear un estado inactivo correctamente", () => {
      const status = AccountStatus.createInactive();
      expect(status.getValue()).toBe(ACCOUNT_STATUS.INACTIVE);
    });

    it("debería crear un estado activo correctamente", () => {
      const status = AccountStatus.createActive();
      expect(status.getValue()).toBe(ACCOUNT_STATUS.ACTIVE);
    });

    it("debería crear un estado válido usando el método create", () => {
      const result = AccountStatus.create(ACCOUNT_STATUS.ACTIVE);
      expect(result.isSuccess).toBe(true);
      expect(result.data.getValue()).toBe(ACCOUNT_STATUS.ACTIVE);
    });

    it("debería fallar al crear un estado inválido", () => {
      const result = AccountStatus.create("invalid-status");
      expect(result.isFailure).toBe(true);
      expect(result.error.message).toBe("Estado de la cuenta no válido: invalid-status");
    });
  });

  describe("Verificación de transiciones", () => {
    it("debería permitir la transición de 'inactive' a 'active'", () => {
      const status = AccountStatus.createInactive();
      expect(status.canTransitionTo(ACCOUNT_STATUS.ACTIVE)).toBe(true);
    });

    it("debería permitir la transición de 'active' a 'inactive'", () => {
      const status = AccountStatus.createActive();
      expect(status.canTransitionTo(ACCOUNT_STATUS.INACTIVE)).toBe(true);
    });

    it("debería impedir transiciones no permitidas", () => {
      const status = AccountStatus.createInactive();
      expect(status.canTransitionTo("invalid")).toBe(false);
    });

    it("debería realizar una transición válida correctamente", () => {
      const inactiveStatus = AccountStatus.createInactive();
      const transitionResult = inactiveStatus.transitionTo(ACCOUNT_STATUS.ACTIVE);

      expect(transitionResult.isSuccess).toBe(true);
      expect(transitionResult.data.getValue()).toBe(ACCOUNT_STATUS.ACTIVE);
    });

    it("debería fallar en una transición inválida", () => {
      const status = AccountStatus.createInactive();
      const transitionResult = status.transitionTo("invalid");

      expect(transitionResult.isFailure).toBe(true);
      expect(transitionResult.error.message).toBe("Transición no permitida de inactive a invalid");
    });
  });

  describe("Métodos auxiliares", () => {
    it("debería devolver correctamente el valor con getValue()", () => {
      const status = AccountStatus.createInactive();
      expect(status.getValue()).toBe(ACCOUNT_STATUS.INACTIVE);
    });

    it("debería devolver correctamente el valor con toString()", () => {
      const status = AccountStatus.createActive();
      expect(status.toString()).toBe(ACCOUNT_STATUS.ACTIVE);
    });
  });
});
