import { JSONPath as jsonpath } from "jsonpath-plus";
import useTranslation from "next-translate/useTranslation";
import { useRouter } from "next/router";
import { useState } from "react";
import { useDropzone } from "react-dropzone";
import { connect } from "react-redux";
import { formValueSelector, reduxForm } from "redux-form";
import { useSession } from "next-auth/react";
import { generateRepPDF, sendEmail, uploadRepFiles } from "../../../actions";
import { formatDates, updateLinks } from "../../../components/utils";
import {
setRepresentationCapacity,
setRepresentationMessageSent,
setRepresentationReset,
setRepresentationSubmit,
setRepresentationSubmitConfirmation,
} from "../../../store/currentView/action";
import ConsultationAgent from "./consultationAgent";
import ConsultationAppellant from "./consultationAppellant";
import ConsultationInterestedPartyPerson from "./consultationInterestedPartyPerson";
import RepAgent from "./representationAgent";
import RepAppellant from "./representationAppellant";
import RepCapacitySelection from "./representationCapacitySelection";
import RepCompleteSubmit from "./representationCompleteSubmit";
import RepInterestedPartyPerson from "./representationInterestedPartyPerson";
import RepLPA from "./representationLPA";
import RepLPACapacitySelection from "./representationLPACapacitySelection";
import RepLandOwner from "./representationLandowner";
import RepresentationProgress_enforcement from "./representationProgress/representationProgress_enforcement";
import RepresentationProgress_s78 from "./representationProgress/representationProgress_s78";
let MakeRepresentation = (props) => {
let { t } = useTranslation();
const { acceptedFiles, getRootProps, getInputProps } = useDropzone();
const [clearRepForm, setClearRepForm] = useState(false);
const [savingStatus, setSavingStatus] = useState(false);
const [finaliseAppealProcess, setFinaliseAppealProcess] = useState(false);
//const [questionnaireCount, setQuestionnaireCount] = useState(0);
const { data: session } = useSession();
const router = useRouter();
const { locale } = router;
const {
caseReference,
myCases,
myRepresentations,
watchedCases,
awaitingSubmission,
searchResultsObj,
representationSubmit,
currentType,
currentView,
setRepresentationCapacity,
setRepresentationSubmit,
setSubmitBack,
handleSubmit,
setRepresentationSubmitConfirmation,
setRepresentationMessageSent,
setShowQuestionnaireSection,
showQuestionnaireSection,
initialValues,
setCurrentReference,
} = props;
const formObj = props.props.form;
let setCaseQueryObj = props[currentType] || {};
var casesObj = {};
const appealType = currentView.caseReference.appealType;
const accountDetails = props.props.accountDetails.accountDetails;
const caseReferenceObj = props.props.currentView.caseReference;
const updateQuestionnaireCount = () => {
const countMap = {
846040000: 7,
846040001: 7,
846040025: 7,
846040004: 7,
846040018: 7,
846040003: 7,
846040009: 7,
846040008: 7,
846040005: 9,
846040006: 9,
846040007: 9,
};
return countMap[appealType] || 7;
};
let questionnaireCount = updateQuestionnaireCount();
const isLPA =
accountDetails[
"pinswg_typeofinvolvement@OData.Community.Display.V1.FormattedValue"
] == "LPA"
? true
: false;
const isNRW = currentView.caseReference?.isNRW;
const setRepFileName = (values) => {
if (
!values.hasOwnProperty("representationCapacity") ||
!values.hasOwnProperty("representationType")
) {
return values;
}
const repCapMap = {
[t("myrepresentations:capacity-options-arr-appellant")]: "APP",
[t("myrepresentations:capacity-options-arr-agent")]: "APP", // agent treated as appellant proxy
[t("myrepresentations:capacity-options-arr-interested")]: "IP",
"Land Owner": "LO",
lpa: "LPA",
LPA: "LPA",
NRW: "NRW",
};
const repTypeMap = {
Statement: "Statement",
"Statement of common ground": "SCG",
"Written statement": "WS",
"Written statement of evidence": "WSE",
Questionnaire: "Questionnaire",
"Final comments": "Comments",
"Consultation Response": "Consultation_Response",
"Local Impact Report": "Local_Impact_Report",
"Marine Impact Report": "Marine_Impact_Report",
Other: "OTHER",
};
const now = new Date();
const pad = (num) => String(num).padStart(2, "0");
const dateStr = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(
now.getDate()
)}-${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(
now.getSeconds()
)}`;
const repCap = repCapMap[values.representationCapacity] || "";
const repType = repTypeMap[values.representationType] || "";
const sanitize = (str) =>
str.replace(/[\s~`!@#$%^&*(){}\[\];:"'<,.>?\/\\|_+=-]/g, "");
const namePart = isLPA
? sanitize(values.onBehalfOfLPA || "")
: `${sanitize(values.lastname || "")}_${sanitize(
values.firstname || ""
)}`;
values.repfile_name =
values.repfile_name ||
`${dateStr}_-_${repCap}_-_${repType}_-_${namePart}`;
return values;
};
isLPA && setRepresentationCapacity("LPA");
const getCasePath = () => {
switch (currentType) {
case "searchResultsObj":
return {
path: `$..[?(@ && @.title=="${caseReference}")]`,
json: setCaseQueryObj,
};
case "watchedCases":
return {
path: `$..[?(@ && @.ticketnumber=="${caseReference}")]`,
json: watchedCases,
};
default:
return {
path: `$..[?(@ && @.reference=="${caseReference}")]`,
json: setCaseQueryObj,
};
}
};
const { path, json } = getCasePath();
casesObj = jsonpath({ path, json, eval: true });
casesObj = Object.assign({}, ...casesObj);
var detailsObj = {};
const capacityOptionsArr = [
t("myrepresentations:capacity-options-arr-appellant"),
t("myrepresentations:capacity-options-arr-agent"),
];
const shouldIncludeInterested =
appealType !== 846040017 ||
caseReferenceObj.specialistProcess !== 846040000;
if (shouldIncludeInterested) {
capacityOptionsArr.push(
t("myrepresentations:capacity-options-arr-interested")
);
}
const isEditState = router.query.state === "edit";
const hasState = router.query.hasOwnProperty("state");
const getCaseDetailsObj = () => {
if (hasState) {
return isEditState
? props.props.myRepresentations.myRepresentations
: props.props.searchResultsObj.searchDetailsObj;
}
return props.currentType === "watchedCases"
? props.props.watchedCases.watchedCasesDetails
: props.props.searchResultsObj.searchDetailsObj;
};
const getCaseResultsObj = () => {
if (hasState) {
return isEditState
? props.props.myRepresentations.myRepresentations
: props.props.searchResultsObj.searchResultsObj;
}
return props.currentType === "watchedCases"
? props.props.watchedCases.watchedCasesDetails
: props.props.searchResultsObj.searchResultsObj;
};
const setCaseDetailsObj = getCaseDetailsObj();
const setCaseResultsObj = getCaseResultsObj();
let resultsObj = jsonpath({
path: `$..[?(@ && @.ticketnumber=="${currentView.caseReference.currentReference}")]`,
json: setCaseResultsObj,
eval: true,
})[0];
// let detailsObj;
if (hasState && isEditState) {
detailsObj = jsonpath({
path: `$..[?(@ && @.repfile_name=="${router.query.created}")]`,
json: setCaseDetailsObj,
eval: true,
})[0];
} else {
detailsObj = jsonpath({
path: `$..[?(@ && @.pinswg_name=="${currentView.caseReference.currentReference}")]`,
json: setCaseDetailsObj,
eval: true,
})[0];
}
const buildRepsArr = (detailsObj) => {
const buildArr = [];
const todaysDate = new Date();
const isDNS = appealType === 846040011;
const isSIPS = appealType === 846040002;
// Determine key dates based on appeal type
const startDate = new Date(
isDNS
? detailsObj.pinswg_applicationacceptedasvalid
: detailsObj.pinswg_startdate || detailsObj.pinswg_startdates
);
const questionnaireDate = new Date(
isDNS
? detailsObj.pinswg_endofrepresentationperiod
: detailsObj.pinswg_questionnaireduedate
);
questionnaireDate.setHours(23, 59, 59, 999);
const finalCommentsDate = new Date(
isDNS
? detailsObj.pinswg_endofrepresentationperiod
: detailsObj.pinswg_finalcommentsduedate
);
finalCommentsDate.setHours(23, 59, 59, 999);
const statementDueDate = new Date(
isDNS
? detailsObj.pinswg_endofrepresentationperiod
: detailsObj.pinswg_statementduedate ||
detailsObj.pinswg_statementsduedate
);
statementDueDate.setHours(23, 59, 59, 999);
// Shared condition
const isWithin = (start, end) =>
todaysDate >= start && todaysDate <= end;
const notAppeal = (...types) => !types.includes(appealType);
// Questionnaire
if (
isLPA &&
notAppeal(846040019, 846040011, 846040015, 846040016) &&
isWithin(startDate, finalCommentsDate)
) {
buildArr.push("Questionnaire");
}
// DNS LPA Documents
if (
isLPA &&
isDNS &&
appealType !== 846040019 &&
isWithin(startDate, finalCommentsDate)
) {
buildArr.push("Local Impact Report", "Statement");
}
// Non-DNS Statement
if (
!isDNS &&
appealType !== 846040004 &&
isWithin(startDate, statementDueDate)
) {
buildArr.push("Statement");
}
// DNS Non-LPA Statement
if (isDNS && !isLPA && isWithin(startDate, statementDueDate)) {
buildArr.push("Statement");
}
// Final Comments
const isSpecialistNonHearing =
currentView.caseReference.specialistProcess !== 846040001;
if (
(appealType !== 846040004 ||
(appealType === 846040015 && isSpecialistNonHearing)) &&
isWithin(statementDueDate, finalCommentsDate)
) {
buildArr.push("Final comments");
}
if (
appealType === 846040004 &&
isSpecialistNonHearing &&
isWithin(statementDueDate, finalCommentsDate)
) {
buildArr.push("Final comments");
}
// Remove "Statement" for LPA Advert Part 3 (no statement)
if (
isLPA &&
appealType === 846040018 &&
currentView.caseReference.specialistProcess === 846040000
) {
const index = buildArr.indexOf("Statement");
if (index !== -1) buildArr.splice(index, 1);
}
// SIPS-related documents
if (isSIPS) {
const capacity = repCapacityType();
if (capacity === "appellant") {
buildArr.push("Consultation Response");
} else {
buildArr.push("Consultation Response", "Local Impact Report");
}
if (isNRW) {
buildArr.push("Marine Impact Report");
}
}
return buildArr;
};
const repCapacityType = () => {
const repForm = formObj["representationForm"];
if (
!repForm ||
!repForm.values ||
!repForm.values.representationCapacity
) {
return false;
}
return repForm.values.representationCapacity
.replace(/(\band|[\s\-\+\(\)\,\&])/g, "")
.toLowerCase();
};
const whichControl = () => {
const commonProps = {
formObj,
setRepresentationCapacity,
setRepresentationSubmit,
onHandleSubmit,
currentView,
setSubmitBack,
props,
setRepFileName,
updateRepresentation,
setSavingStatus,
savingStatus,
setCurrentReference,
};
const getNormalizedCapacity = () => {
const rawCapacity =
currentView.representationCapacity ||
currentView.caseReference?.repDetails?.representationCapacity ||
"false";
return rawCapacity.toLowerCase();
};
if (
isLPA &&
(!currentView.representationCapacity ||
currentView.representationCapacity === "")
) {
return (