import { z } from "zod";

const GitTreeSchema = z.string().regex(/^[0-9a-f]{40}$/);
const DigestSchema = z.string().regex(/^[0-9a-f]{64}$/);

export const GateReceiptIdentitySchema = z.object({
  candidateTree: GitTreeSchema,
  gateGraphDigest: DigestSchema,
  declaredInputsDigest: DigestSchema,
  lockfileDigest: DigestSchema,
  toolchainDigest: DigestSchema,
  fixtureSchemaDigest: DigestSchema,
  commandDigest: DigestSchema,
  warningDigest: DigestSchema,
  logDigest: DigestSchema,
  artifactDigest: DigestSchema,
}).strict();

export type GateReceiptIdentity = z.infer<typeof GateReceiptIdentitySchema>;

export function gateReceiptIdentityMatches(
  receipt: GateReceiptIdentity,
  requested: GateReceiptIdentity,
): boolean {
  const left = GateReceiptIdentitySchema.parse(receipt);
  const right = GateReceiptIdentitySchema.parse(requested);
  return Object.keys(left).every((field) =>
    left[field as keyof GateReceiptIdentity] === right[field as keyof GateReceiptIdentity]);
}
