import { describe, it, expect } from "vitest";
import { getBestEmail } from "./getBestEmail.helper";
import { ARCAEmail } from "../types";

const MOCK = [
  {
    direccion: "tomas.ghertner6@yahoo.com.ar",
    estado: "Confirmado",
    tipoEmail: "Personal",
  },
];
const MOCK_2 = [
  {
    direccion: "juancruz.paradela12@hotmail.com",
    estado: "Confirmado",
    tipoEmail: "Personal",
  },
];
const MOCK_3: ARCAEmail[] = [];

const MOCK_4 = [
  {
    direccion: "ximena.pizzorno17@gmail.com",
    estado: "No Confirmado por Aplicacion",
    tipoEmail: "Personal",
  },
];

const MOCK_5 = [
  {
    direccion: "naomi.apellido18@gmail.com",
    estado: "No Confirmado por Aplicacion",
    tipoEmail: "Personal",
  },
  {
    direccion: "andreagraciela.moretti5@yahoo.com.ar",
    estado: "No Confirmado por Aplicacion",
    tipoEmail: "Tributario",
  },
];

const MOCK_6 = [
  {
    direccion: "andreagraciela.moretti5@yahoo.com.ar",
    estado: "No Confirmado por Aplicacion",
    tipoEmail: "Personal",
  },
  {
    direccion: "naomi.apellido18@gmail.com",
    estado: "No Confirmado por Aplicacion",
    tipoEmail: "Personal",
  },
  {
    direccion: "ximena.pizzorno17@gmail.com",
    estado: "No Confirmado por Aplicacion",
    tipoEmail: "Comercial",
  },
];

describe("getBestEmail", () => {
  it("debe retornar valores vacíos cuando no hay emails", () => {
    expect(getBestEmail(MOCK_3)).toEqual({
      email: "",
      type: "",
    });
  });

  it("debe retornar el único email disponible", () => {
    expect(getBestEmail(MOCK)).toEqual({
      email: "tomas.ghertner6@yahoo.com.ar",
      type: "Personal",
    });
  });

  it("debe retornar el único email aunque no esté confirmado", () => {
    expect(getBestEmail(MOCK_4)).toEqual({
      email: "ximena.pizzorno17@gmail.com",
      type: "Personal",
    });
  });

  it("debe priorizar Personal sobre Tributario cuando ninguno está confirmado", () => {
    expect(getBestEmail(MOCK_5)).toEqual({
      email: "naomi.apellido18@gmail.com",
      type: "Personal",
    });
  });

  it("debe priorizar Comercial sobre Personal cuando ninguno está confirmado", () => {
    expect(getBestEmail(MOCK_6)).toEqual({
      email: "ximena.pizzorno17@gmail.com",
      type: "Comercial",
    });
  });

  it("debe retornar inmediatamente un Comercial confirmado", () => {
    const emails = [
      {
        direccion: "personal@gmail.com",
        estado: "Confirmado",
        tipoEmail: "Personal",
      },
      {
        direccion: "comercial@gmail.com",
        estado: "Confirmado",
        tipoEmail: "Comercial",
      },
    ];

    expect(getBestEmail(emails)).toEqual({
      email: "comercial@gmail.com",
      type: "Comercial",
    });
  });

  it("debe priorizar Comercial no confirmado sobre Personal confirmado", () => {
    const emails = [
      {
        direccion: "personal@gmail.com",
        estado: "Confirmado",
        tipoEmail: "Personal",
      },
      {
        direccion: "comercial@gmail.com",
        estado: "No Confirmado por Aplicacion",
        tipoEmail: "Comercial",
      },
    ];

    expect(getBestEmail(emails)).toEqual({
      email: "comercial@gmail.com",
      type: "Comercial",
    });
  });

  it("debe priorizar Personal no confirmado sobre Tributario confirmado", () => {
    const emails = [
      {
        direccion: "tributario@gmail.com",
        estado: "Confirmado",
        tipoEmail: "Tributario",
      },
      {
        direccion: "personal@gmail.com",
        estado: "No Confirmado por Aplicacion",
        tipoEmail: "Personal",
      },
    ];

    expect(getBestEmail(emails)).toEqual({
      email: "personal@gmail.com",
      type: "Personal",
    });
  });

  it("debe considerar tipos desconocidos con menor prioridad", () => {
    const emails = [
      {
        direccion: "desconocido@gmail.com",
        estado: "Confirmado",
        tipoEmail: "Otro",
      },
      {
        direccion: "personal@gmail.com",
        estado: "No Confirmado por Aplicacion",
        tipoEmail: "Personal",
      },
    ];

    expect(getBestEmail(emails)).toEqual({
      email: "personal@gmail.com",
      type: "Personal",
    });
  });
});
