import type { EoiContext } from '@/lib/services/eoi-context';

export interface DocumensoTemplatePayload {
  title: string;
  externalId: string;
  meta: {
    message: string;
    subject: string;
    redirectUrl: string;
    distributionMethod: 'NONE' | 'EMAIL';
  };
  formValues: {
    Name: string;
    Email: string;
    Address: string;
    'Yacht Name': string;
    Length: string;
    Width: string;
    Draft: string;
    'Berth Number': string;
    Lease_10: boolean;
    Purchase: boolean;
  };
  recipients: Array<{
    id: number;
    name: string;
    email: string;
    role: 'SIGNER' | 'APPROVER';
    signingOrder: number;
  }>;
}

export interface DocumensoPayloadOptions {
  /** `interestId` used to build `externalId` and Documenso referencing. */
  interestId: string;
  /** Documenso recipient IDs — come from env vars. */
  clientRecipientId: number;
  developerRecipientId: number;
  approvalRecipientId: number;
  /** Hardcoded developer + approver names/emails (legacy). */
  developerName?: string;
  developerEmail?: string;
  approverName?: string;
  approverEmail?: string;
  /** Redirect URL after signing. Defaults to the app URL. */
  redirectUrl?: string;
}

const DEFAULT_DEVELOPER_NAME = 'David Mizrahi';
const DEFAULT_DEVELOPER_EMAIL = 'dm@portnimara.com';
const DEFAULT_APPROVER_NAME = 'Abbie May';
const DEFAULT_APPROVER_EMAIL = 'sales@portnimara.com';
const DEFAULT_REDIRECT_URL = 'https://portnimara.com';

function formatAddress(address: EoiContext['client']['address']): string {
  if (!address) return '';
  return [address.street, address.city, address.country].filter(Boolean).join(', ');
}

function buildMessage(context: EoiContext): string {
  const greeting = `Dear ${context.client.fullName},`;
  const body = `Thank you for your interest in a berth at ${context.port.name}. Please click the link above to sign your LOI.`;
  const onBehalf =
    context.owner.type === 'company' && context.company
      ? `\n\nOn behalf of ${context.company.legalName ?? context.company.name} (representing the yacht's owner).`
      : '';
  const footer = `\n\nBest Regards,\n${context.port.name} Team`;
  return `${greeting}\n\n${body}${onBehalf}${footer}`;
}

export function buildDocumensoPayload(
  context: EoiContext,
  options: DocumensoPayloadOptions,
): DocumensoTemplatePayload {
  return {
    title: `${context.client.fullName}-EOI-NDA`,
    externalId: `loi-${options.interestId}`,
    meta: {
      message: buildMessage(context),
      subject: 'Your LOI is ready to be signed',
      redirectUrl: options.redirectUrl ?? DEFAULT_REDIRECT_URL,
      distributionMethod: 'NONE',
    },
    formValues: {
      Name: context.client.fullName,
      Email: context.client.primaryEmail ?? '',
      Address: formatAddress(context.client.address),
      'Yacht Name': context.yacht.name,
      Length: context.yacht.lengthFt ?? '',
      Width: context.yacht.widthFt ?? '',
      Draft: context.yacht.draftFt ?? '',
      'Berth Number': context.berth.mooringNumber,
      Lease_10: false,
      Purchase: true,
    },
    recipients: [
      {
        id: options.clientRecipientId,
        name: context.client.fullName,
        email: context.client.primaryEmail ?? '',
        role: 'SIGNER',
        signingOrder: 1,
      },
      {
        id: options.developerRecipientId,
        name: options.developerName ?? DEFAULT_DEVELOPER_NAME,
        email: options.developerEmail ?? DEFAULT_DEVELOPER_EMAIL,
        role: 'SIGNER',
        signingOrder: 2,
      },
      {
        id: options.approvalRecipientId,
        name: options.approverName ?? DEFAULT_APPROVER_NAME,
        email: options.approverEmail ?? DEFAULT_APPROVER_EMAIL,
        role: 'APPROVER',
        signingOrder: 3,
      },
    ],
  };
}
