import { describe, it, expect } from "vitest";

import {
  insertDiagramSchema,
  selectDiagramSchema,
  insertProjectSchema,
  selectProjectSchema,
} from "@turbostarter/db/schema";

describe("insertDiagramSchema", () => {
  it("should accept valid diagram insert data", () => {
    const result = insertDiagramSchema.safeParse({
      title: "Test Diagram",
      type: "flowchart",
      userId: "user-123",
    });
    expect(result.success).toBe(true);
  });

  it("should reject missing required fields", () => {
    const result = insertDiagramSchema.safeParse({});
    expect(result.success).toBe(false);
  });

  it("should reject invalid diagram type", () => {
    const result = insertDiagramSchema.safeParse({
      title: "Test",
      type: "invalid-type",
      userId: "user-123",
    });
    expect(result.success).toBe(false);
  });

  it("should accept all valid diagram types", () => {
    const types = ["bpmn", "er", "orgchart", "architecture", "sequence", "flowchart"];
    for (const type of types) {
      const result = insertDiagramSchema.safeParse({
        title: "Test",
        type,
        userId: "user-123",
      });
      expect(result.success).toBe(true);
    }
  });

  it("should accept optional fields", () => {
    const result = insertDiagramSchema.safeParse({
      title: "Test",
      type: "bpmn",
      userId: "user-123",
      projectId: "proj-123",
      lastAiMessage: "Hello",
      graphData: { nodes: [] },
    });
    expect(result.success).toBe(true);
  });
});

describe("selectDiagramSchema", () => {
  it("should accept a complete diagram record", () => {
    const result = selectDiagramSchema.safeParse({
      id: "diag-123",
      title: "Test Diagram",
      type: "er",
      graphData: {},
      userId: "user-123",
      projectId: null,
      sortOrder: 0,
      lastAiMessage: null,
      deletedAt: null,
      createdAt: new Date(),
      updatedAt: new Date(),
    });
    expect(result.success).toBe(true);
  });
});

describe("insertProjectSchema", () => {
  it("should accept valid project insert data with field assertions", () => {
    const result = insertProjectSchema.safeParse({
      name: "My Project",
      userId: "user-123",
    });
    expect(result.success).toBe(true);
    if (result.success) {
      expect(result.data.name).toBe("My Project");
      expect(result.data.userId).toBe("user-123");
    }
  });

  it("should accept optional sortOrder", () => {
    const result = insertProjectSchema.safeParse({
      name: "My Project",
      userId: "user-123",
      sortOrder: 5,
    });
    expect(result.success).toBe(true);
  });
});

describe("selectProjectSchema", () => {
  it("should accept a complete project record", () => {
    const result = selectProjectSchema.safeParse({
      id: "proj-123",
      name: "My Project",
      userId: "user-123",
      sortOrder: 0,
      createdAt: new Date(),
      updatedAt: new Date(),
    });
    expect(result.success).toBe(true);
  });
});
