export interface CropPlanFormSlice {
  crop: string;
  areaHa: string;
  expectedYield: string;
}

export type CropPlanField = "crop" | "areaHa" | "expectedYield";

export type CropPlanValidationIssue =
  | { kind: "missing"; cropIndex: number; field: CropPlanField }
  | { kind: "areaExceeded"; cropAreaSum: number; totalLandHa: number };

function cropAreaSum(crops: CropPlanFormSlice[]): number {
  return crops.reduce((sum, c) => sum + (Number(c.areaHa) || 0), 0);
}

export function getCropPlanValidationIssues(
  crops: CropPlanFormSlice[],
  totalLandHa = 0,
): CropPlanValidationIssue[] {
  const issues: CropPlanValidationIssue[] = [];

  crops.forEach((entry, cropIndex) => {
    if (!entry.crop) issues.push({ kind: "missing", cropIndex, field: "crop" });
    if (!entry.areaHa || Number(entry.areaHa) <= 0) {
      issues.push({ kind: "missing", cropIndex, field: "areaHa" });
    }
    if (!entry.expectedYield) {
      issues.push({ kind: "missing", cropIndex, field: "expectedYield" });
    }
  });

  const sum = cropAreaSum(crops);
  if (totalLandHa > 0 && sum > totalLandHa + 0.001) {
    issues.push({ kind: "areaExceeded", cropAreaSum: sum, totalLandHa });
  }

  return issues;
}

export function isCropPlanComplete(crops: CropPlanFormSlice[], totalLandHa = 0): boolean {
  return crops.length > 0 && getCropPlanValidationIssues(crops, totalLandHa).length === 0;
}
