import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import { ReviewDocumentStatus } from './types/review';
import { isValidTransition } from './reviewStateMachine';
import { isLightweightEditExempt } from './lightweightEditExemption';
import { writeAuditLog } from './auditLog';
import { detectRegulationChange } from './regulationChangeDetector';

export const onDocumentUpdateReview = functions.firestore
  .document('documents/{docId}')
  .onUpdate(async (change, context) => {
    const { docId } = context.params;
    const beforeData = change.before.data();
    const afterData = change.after.data();

    // 규정 변경 감지 — 규정 문서의 메타데이터가 변경되면 무조건 재검토 (경량 면제 불가)
    const currentStatusForRegulation = (afterData.status ?? 'published') as ReviewDocumentStatus;
    const regulationResult = detectRegulationChange(beforeData, afterData);
    if (regulationResult.shouldReReview && ['approved', 'published'].includes(currentStatusForRegulation)) {
      if (isValidTransition(currentStatusForRegulation, 'needs_re_review')) {
        const db = admin.firestore();
        const docRef = db.collection('documents').doc(docId);
        await docRef.update({
          status: 'needs_re_review',
          updatedAt: admin.firestore.FieldValue.serverTimestamp(),
        });
        await writeAuditLog({
          docId,
          action: 'status_change',
          actorId: (afterData.editingBy ?? afterData.authorId ?? 'system') as string,
          previousStatus: currentStatusForRegulation,
          newStatus: 'needs_re_review',
          metadata: { reason: regulationResult.reason },
        });
        return; // 이미 재검토 전환했으므로 content 체크 불필요
      }
    }

    // content 변경이 아니면 스킵 (무한 루프 방지: status만 변경된 경우 즉시 return)
    const oldContent = beforeData.content ?? '';
    const newContent = afterData.content ?? '';
    if (oldContent === newContent) return;

    // 상태가 approved 또는 published가 아니면 스킵
    const currentStatus = (afterData.status ?? 'published') as ReviewDocumentStatus;
    if (!['approved', 'published'].includes(currentStatus)) return;

    // needs_re_review 전이가 가능한지 확인
    if (!isValidTransition(currentStatus, 'needs_re_review')) return;

    const db = admin.firestore();
    const sourceType = afterData.sourceType;

    // 경량 수정 면제 체크
    const exemptionResult = await isLightweightEditExempt({
      oldContent,
      newContent,
      sourceType,
      docId,
      db,
    });

    const docRef = db.collection('documents').doc(docId);
    // 수정자 정보 (editingBy 또는 authorId)
    const actorId = afterData.editingBy ?? afterData.authorId ?? 'unknown';

    if (exemptionResult.exempt) {
      // 면제 → 감사 로그만 기록
      await writeAuditLog({
        docId,
        action: 'lightweight_edit_exempted',
        actorId,
        metadata: {
          charDiff: Math.abs(oldContent.length - newContent.length),
        },
      });
      return;
    }

    // 면제 불가 → needs_re_review 전환
    await docRef.update({
      status: 'needs_re_review',
      updatedAt: admin.firestore.FieldValue.serverTimestamp(),
    });

    await writeAuditLog({
      docId,
      action: 'status_change',
      actorId,
      previousStatus: currentStatus,
      newStatus: 'needs_re_review',
      metadata: {
        reason: 'content_modified_after_approval',
        failedExemptionConditions: exemptionResult.failedConditions,
      },
    });
  });
