"use client";

import { Space, Typography, message } from "antd";
import { useRouter } from "next/navigation";

import { VulnerabilityEditorForm } from "@/app/dashboard/vulnerabilities/_components/vulnerability-editor-form";
import { PageStateNotice } from "@/components/common/page-state-notice";
import {
  createVulnerability,
  type CreateVulnerabilityPayload,
} from "@/lib/api/vulnerabilities";
import { useAuth } from "@/lib/hooks/use-auth";

const { Title, Paragraph } = Typography;

const SUBMIT_PERMISSION = "vuln:submit_findings";

export default function SubmitVulnerabilityPage() {
  const router = useRouter();
  const { hasPermission } = useAuth();
  const canSubmit = hasPermission(SUBMIT_PERMISSION);

  const handleSubmit = async (
    payload: CreateVulnerabilityPayload,
  ): Promise<void> => {
    const record = await createVulnerability(payload);
    const publicId = record.public_id?.trim();
    message.success(
      `Vulnerability submitted as ${record.public_id ?? `#${record.id}`}`,
    );
    if (!publicId) {
      message.error("Submitted vulnerability is missing a public ID.");
      return;
    }
    router.push(`/dashboard/vulnerabilities/${publicId}`);
  };

  if (!canSubmit) {
    return (
      <PageStateNotice
        tone="unavailable"
        title="Submission unavailable"
        description={`Your account is missing the ${SUBMIT_PERMISSION} permission required to submit vulnerabilities. Contact an administrator to request access.`}
      />
    );
  }

  return (
    <Space direction="vertical" size={16} style={{ width: "100%" }}>
      <div>
        <Title level={3} style={{ marginBottom: 4 }}>
          Submit Vulnerability
        </Title>
        <Paragraph type="secondary" style={{ margin: 0 }}>
          Provide context, rich descriptions, and supporting images. Files are
          stored securely in S3 via a pre-signed upload.
        </Paragraph>
      </div>

      <VulnerabilityEditorForm
        mode="create"
        submitLabel="Submit"
        onSubmit={(payload) =>
          handleSubmit(payload as CreateVulnerabilityPayload)
        }
        onCancel={() => router.push("/dashboard/vulnerabilities/list")}
      />
    </Space>
  );
}
