import {
  unsafeOpaqueId,
  type FactoryRunId,
  type GoalId,
  type PlanId,
  type PlanRevisionId,
  type ProjectId,
  type TaskId,
} from "@awp/contracts";
import type { C1ProjectOverviewPayload, C1TaskFixturePayload } from "./model.js";

const projectId = unsafeOpaqueId<ProjectId>("project-i1");
const goalId = unsafeOpaqueId<GoalId>("goal-i1");
const planId = unsafeOpaqueId<PlanId>("plan-i1");
const revisionId = unsafeOpaqueId<PlanRevisionId>("plan-revision-i1");
const foundationTaskId = unsafeOpaqueId<TaskId>("task-foundation");
const uiTaskId = unsafeOpaqueId<TaskId>("task-ui");
const factoryRunId = unsafeOpaqueId<FactoryRunId>("factory-run-i1");

/**
 * Browser-safe serialized snapshot of Lane A's deterministic C1 read model.
 * A focused contract test compares this object with projectOverviewReadModel(...)
 * from @awp/application so drift fails the UI lane rather than silently forking.
 */
export const c1ProjectOverviewSnapshot: C1ProjectOverviewPayload = {
  project: {
    id: projectId,
    name: "AWP dogfood",
    repositoryUrl: "https://github.com/platform-modules/awp.git",
    requiredChecks: ["CI"],
    status: "active",
  },
  goals: [
    {
      id: goalId,
      title: "Ship first vertical slice",
      status: "active",
    },
  ],
  plans: [
    {
      id: planId,
      title: "I1 vertical slice",
      status: "active",
      goalIds: [goalId],
    },
  ],
  queue: [
    {
      taskId: foundationTaskId,
      planRevisionId: revisionId,
      goalIds: [goalId],
      position: 0,
      readinessState: "DONE",
      unsatisfiedDependencyIds: [],
    },
    {
      taskId: uiTaskId,
      planRevisionId: revisionId,
      goalIds: [goalId],
      position: 1,
      readinessState: "READY",
      unsatisfiedDependencyIds: [],
    },
  ],
  factoryRuns: [
    {
      id: factoryRunId,
      status: "running",
    },
  ],
};

/**
 * Exact serialized Lane A Task fixtures used only to expose dependency meaning
 * that the C1 Project Overview read model intentionally does not carry.
 */
export const c1TaskFixtureSnapshot: readonly C1TaskFixturePayload[] = [
  {
    id: foundationTaskId,
    projectId,
    planRevisionId: revisionId,
    title: "Core contracts",
    status: "completed",
    dependencyIds: [],
    goalIds: [goalId],
    revision: 1,
  },
  {
    id: uiTaskId,
    projectId,
    planRevisionId: revisionId,
    title: "Project UI",
    status: "ready",
    dependencyIds: [foundationTaskId],
    goalIds: [goalId],
    revision: 1,
  },
];
