import { Injectable, Logger, ServiceUnavailableException } from '@nestjs/common';
import { SignatureStatus } from '@prisma/client';
import * as crypto from 'crypto';

export interface SignatureProvider {
  readonly code: string;
  createSigningRequest(params: {
    documentUrl: string;
    documentTitle: string;
    signerEmail: string;
    signerName?: string;
    callbackUrl?: string;
  }): Promise<{ providerRef: string; signingUrl: string; expiresAt?: Date }>;

  parseCallback(rawBody: string, headers: Record<string, string>): Promise<{
    providerRef: string;
    status: SignatureStatus;
  }>;
}

@Injectable()
export class StubSignatureProvider implements SignatureProvider {
  readonly code = 'STUB';
  private readonly logger = new Logger('StubSignatureProvider');

  async createSigningRequest(params: any) {
    if (process.env.ENABLE_STUB_PROVIDERS !== 'true') {
      throw new ServiceUnavailableException('Signature provider is not configured');
    }
    const ref = `sig_${crypto.randomBytes(8).toString('hex')}`;
    this.logger.log(`[STUB signature] request created ref=${ref} signer=${params.signerEmail}`);
    return {
      providerRef: ref,
      signingUrl: `${process.env.APP_BASE_URL ?? 'http://localhost:3000/api/v1'}/documents/signature/stub-sign/${ref}`,
      expiresAt: new Date(Date.now() + 7 * 24 * 3600 * 1000),
    };
  }

  async parseCallback(rawBody: string) {
    if (process.env.ENABLE_STUB_PROVIDERS !== 'true') {
      throw new ServiceUnavailableException('Signature provider is not configured');
    }
    const data = JSON.parse(rawBody);
    return {
      providerRef: data.providerRef,
      status: (data.status as SignatureStatus) ?? SignatureStatus.SIGNED,
    };
  }
}
