import { describe, it, expect } from "bun:test";
import { squidRouterPlugin } from "../index";
import { xChainSwapAction } from "../actions/xChainSwap";
import { squidRouterProvider } from "../providers/squidRouter";

describe("squidRouterPlugin", () => {
  it("should have correct name", () => {
    expect(squidRouterPlugin.name).toBe("squid-router");
  });

  it("should have correct description", () => {
    expect(squidRouterPlugin.description).toBe("Squid router plugin");
  });

  it("should include xChainSwapAction in actions", () => {
    expect(squidRouterPlugin.actions).toContain(xChainSwapAction);
    expect(squidRouterPlugin.actions).toHaveLength(1);
  });

  it("should include squidRouterProvider in providers", () => {
    expect(squidRouterPlugin.providers).toContain(squidRouterProvider);
    expect(squidRouterPlugin.providers).toHaveLength(1);
  });

  it("should have empty evaluators array", () => {
    expect(squidRouterPlugin.evaluators).toEqual([]);
  });

  it("should have empty services array", () => {
    expect(squidRouterPlugin.services).toEqual([]);
  });

  it("should export all required components", () => {
    // Import everything to check exports
    const moduleExports = require("../index");

    // Check plugin export
    expect(moduleExports.squidRouterPlugin).toBeDefined();
    expect(moduleExports.default).toBe(squidRouterPlugin);

    // Check action exports
    expect(moduleExports.xChainSwapAction).toBeDefined();
    expect(moduleExports.xChainSwapTemplate).toBeDefined();

    // Check provider exports
    expect(moduleExports.squidRouterProvider).toBeDefined();
    expect(moduleExports.SquidRouterProvider).toBeDefined();
    expect(moduleExports.initSquidRouterProvider).toBeDefined();

    // Check type exports
    expect(moduleExports.nativeTokenConstant).toBeDefined();
  });

  it("should match Plugin interface structure", () => {
    expect(squidRouterPlugin).toHaveProperty("name");
    expect(squidRouterPlugin).toHaveProperty("description");
    expect(squidRouterPlugin).toHaveProperty("providers");
    expect(squidRouterPlugin).toHaveProperty("actions");
    expect(squidRouterPlugin).toHaveProperty("evaluators");
    expect(squidRouterPlugin).toHaveProperty("services");

    expect(typeof squidRouterPlugin.name).toBe("string");
    expect(typeof squidRouterPlugin.description).toBe("string");
    expect(Array.isArray(squidRouterPlugin.providers)).toBe(true);
    expect(Array.isArray(squidRouterPlugin.actions)).toBe(true);
    expect(Array.isArray(squidRouterPlugin.evaluators)).toBe(true);
    expect(Array.isArray(squidRouterPlugin.services)).toBe(true);
  });
});
