import fs from "node:fs";
import { manifestPathForFeature, featureRootForFile } from "./_manifest-source.js";

/** @type {import("eslint").Rule.RuleModule} */
export default {
  meta: {
    type: "problem",
    docs: {
      description:
        "Every feature with use-case files must declare a feature.manifest.ts at its src/ root.",
    },
    schema: [
      {
        type: "object",
        properties: {
          repoRoot: { type: "string" },
        },
        additionalProperties: false,
      },
    ],
    messages: {
      missingManifest:
        "Feature {{feature}} has use cases but no feature.manifest.ts. Run `pnpm turbo gen feature {{feature}}` or scaffold the manifest manually at {{expected}}.",
    },
  },
  create(context) {
    const opts = context.options[0] ?? {};
    const repoRoot = opts.repoRoot ?? context.cwd ?? process.cwd();
    return {
      Program(node) {
        const filename = context.filename;
        const featureRoot = featureRootForFile(filename, repoRoot);
        if (!featureRoot) return;
        // Only check use-case files
        if (!filename.includes("/application/use-cases/") || !filename.endsWith(".use-case.ts")) {
          return;
        }
        const manifestPath = manifestPathForFeature(featureRoot);
        if (fs.existsSync(manifestPath)) return;
        const featureName = featureRoot.split("/").pop();
        context.report({
          node,
          messageId: "missingManifest",
          data: { feature: featureName, expected: manifestPath },
        });
      },
    };
  },
};
