import { describe, it, expect, beforeEach } from "vitest";
import { safeLocalGet } from "../localStorage";

beforeEach(() => {
  localStorage.clear();
});

describe("safeLocalGet", () => {
  describe("chave ausente", () => {
    it("retorna null quando a chave não existe", () => {
      expect(safeLocalGet("inexistente")).toBeNull();
    });
  });

  describe("JSON corrompido", () => {
    it("retorna null e remove a chave quando o valor não é JSON válido", () => {
      localStorage.setItem("key", "not-json{{");
      expect(safeLocalGet("key")).toBeNull();
      expect(localStorage.getItem("key")).toBeNull();
    });

    it("retorna null e remove a chave quando o valor está vazio", () => {
      localStorage.setItem("key", "");
      expect(safeLocalGet("key")).toBeNull();
      expect(localStorage.getItem("key")).toBeNull();
    });
  });

  describe("sem validator", () => {
    it("retorna o valor parseado para string", () => {
      localStorage.setItem("key", JSON.stringify("olá"));
      expect(safeLocalGet("key")).toBe("olá");
    });

    it("retorna o valor parseado para array", () => {
      localStorage.setItem("key", JSON.stringify([1, 2, 3]));
      expect(safeLocalGet("key")).toEqual([1, 2, 3]);
    });

    it("retorna o valor parseado para objeto", () => {
      localStorage.setItem("key", JSON.stringify({ a: 1 }));
      expect(safeLocalGet("key")).toEqual({ a: 1 });
    });

    it("retorna o valor parseado para número zero", () => {
      localStorage.setItem("key", JSON.stringify(0));
      expect(safeLocalGet("key")).toBe(0);
    });
  });

  describe("com validator", () => {
    it("retorna o valor quando o validator passa", () => {
      localStorage.setItem("key", JSON.stringify([1, 2, 3]));
      expect(safeLocalGet("key", Array.isArray)).toEqual([1, 2, 3]);
    });

    it("retorna null quando o validator falha", () => {
      localStorage.setItem("key", JSON.stringify("uma string"));
      expect(safeLocalGet("key", Array.isArray)).toBeNull();
    });

    it("não remove a chave quando o validator falha (dado não é corrompido)", () => {
      localStorage.setItem("key", JSON.stringify("uma string"));
      safeLocalGet("key", Array.isArray);
      // Chave ainda existe — só não passou na validação de negócio
      expect(localStorage.getItem("key")).not.toBeNull();
    });

    it("retorna null quando o validator recebe null mas chave não existe", () => {
      expect(safeLocalGet("inexistente", Array.isArray)).toBeNull();
    });
  });
});
