import { describe, expect, it, vi } from "vitest";
import {
  deleteEntity,
  isDeletableEntity,
} from "../../../src/common/entity/delete_entity";
import type { ConfigEntry } from "../../../src/data/config_entries";
import type { EntityRegistryEntry } from "../../../src/data/entity/entity_registry";
import type { IntegrationManifest } from "../../../src/data/integration";
import type { Helper } from "../../../src/panels/config/helpers/const";
import type { HomeAssistant } from "../../../src/types";

describe("isDeletableEntity", () => {
  it("should return true for restored entities", () => {
    const hass = {
      states: { "light.test": { attributes: { restored: true } } },
    } as unknown as HomeAssistant;
    const result = isDeletableEntity(hass, "light.test", [], [], [], []);
    expect(result).toBe(true);
  });

  it("should return false for non-restored entities without config entry", () => {
    const hass = {
      states: { "light.test": { attributes: {} } },
    } as unknown as HomeAssistant;
    const entityRegistry = [
      { entity_id: "light.test" },
    ] as EntityRegistryEntry[];
    const result = isDeletableEntity(
      hass,
      "light.test",
      [],
      entityRegistry,
      [],
      []
    );
    expect(result).toBe(false);
  });

  it("should return true for helper domain entities", () => {
    const hass = {
      states: { "input_boolean.test": { attributes: {} } },
      config: { components: ["input_boolean"] },
    } as unknown as HomeAssistant;
    const entityRegistry = [
      { entity_id: "input_boolean.test", unique_id: "123" },
    ] as EntityRegistryEntry[];
    const fetchedHelpers = [{ id: "123" }] as Helper[];
    const result = isDeletableEntity(
      hass,
      "input_boolean.test",
      [],
      entityRegistry,
      [],
      fetchedHelpers
    );
    expect(result).toBe(true);
  });

  it("should return false for non-helper domain entities without restored attribute", () => {
    const hass = {
      states: { "light.test": { attributes: {} } },
    } as unknown as HomeAssistant;
    const entityRegistry = [
      { entity_id: "light.test" },
    ] as EntityRegistryEntry[];
    const result = isDeletableEntity(
      hass,
      "light.test",
      [],
      entityRegistry,
      [],
      []
    );
    expect(result).toBe(false);
  });

  it("should return true for entities with helper integration type", () => {
    const hass = {
      states: { "light.test": { attributes: {} } },
    } as unknown as HomeAssistant;
    const entityRegistry = [
      { entity_id: "light.test", config_entry_id: "config_1" },
    ] as EntityRegistryEntry[];
    const configEntries = [
      { entry_id: "config_1", domain: "light" },
    ] as ConfigEntry[];
    const manifests = [
      { domain: "light", integration_type: "helper" },
    ] as IntegrationManifest[];
    const result = isDeletableEntity(
      hass,
      "light.test",
      manifests,
      entityRegistry,
      configEntries,
      []
    );
    expect(result).toBe(true);
  });
});

describe("deleteEntity", () => {
  it("should call removeEntityRegistryEntry for restored entities", () => {
    const removeEntityRegistryEntry = vi.fn();
    const hass = {
      states: { "light.test": { attributes: { restored: true } } },
      callWS: removeEntityRegistryEntry,
    } as unknown as HomeAssistant;
    const entityRegistry = [
      { entity_id: "light.test" },
    ] as EntityRegistryEntry[];
    deleteEntity(hass, "light.test", [], entityRegistry, [], []);
    expect(removeEntityRegistryEntry).toHaveBeenCalledWith({
      type: "config/entity_registry/remove",
      entity_id: "light.test",
    });
  });

  it("should call deleteConfigEntry for entities with helper integration type", () => {
    const deleteConfigEntry = vi.fn();
    const hass = {
      states: { "light.test": { attributes: {} } },
      callApi: deleteConfigEntry,
    } as unknown as HomeAssistant;
    const entityRegistry = [
      { entity_id: "light.test", config_entry_id: "config_1" },
    ] as EntityRegistryEntry[];
    const configEntries = [
      { entry_id: "config_1", domain: "light" },
    ] as ConfigEntry[];
    const manifests = [
      { domain: "light", integration_type: "helper" },
    ] as IntegrationManifest[];
    deleteEntity(
      hass,
      "light.test",
      manifests,
      entityRegistry,
      configEntries,
      []
    );
    expect(deleteConfigEntry).toHaveBeenCalledOnce();
  });

  it("should call HELPERS_CRUD.delete for helper domain entities", () => {
    const deleteCall = vi.fn();
    const hass = {
      states: { "input_boolean.test": { attributes: {} } },
      config: { components: ["input_boolean"] },
      callWS: deleteCall,
    } as unknown as HomeAssistant;
    const entityRegistry = [
      { entity_id: "input_boolean.test", unique_id: "123" },
    ] as EntityRegistryEntry[];
    const fetchedHelpers = [{ id: "123" }] as Helper[];
    deleteEntity(
      hass,
      "input_boolean.test",
      [],
      entityRegistry,
      [],
      fetchedHelpers
    );
    expect(deleteCall).toHaveBeenCalledWith({
      type: "input_boolean/delete",
      input_boolean_id: "123",
    });
  });

  it("should call removeEntityRegistryEntry for helper domain entities", () => {
    const removeEntityRegistryEntry = vi.fn();
    const hass = {
      states: { "input_boolean.test": { attributes: { restored: true } } },
      config: { components: ["input_boolean"] },
      callWS: removeEntityRegistryEntry,
    } as unknown as HomeAssistant;
    const entityRegistry = [
      { entity_id: "input_boolean.test", unique_id: "124" },
    ] as EntityRegistryEntry[];
    const fetchedHelpers = [{ id: "123" }] as Helper[];
    deleteEntity(
      hass,
      "input_boolean.test",
      [],
      entityRegistry,
      [],
      fetchedHelpers
    );
    expect(removeEntityRegistryEntry).toHaveBeenCalledWith({
      type: "config/entity_registry/remove",
      entity_id: "input_boolean.test",
    });
  });
});
