import { pool } from './db';

export type RelationshipEventType =
  | 'request_sent' | 'request_accepted' | 'request_declined' | 'request_withdrawn'
  | 'photo_requested' | 'photo_approved' | 'photo_declined' | 'photo_shared' | 'photo_hidden'
  | 'meeting_proposed' | 'meeting_confirmed' | 'meeting_cancelled' | 'meeting_completed'
  | 'call_joined' | 'call_left';

export const recordRequestEvent = async (
  requestId: string,
  actorUserId: string | null,
  eventType: RelationshipEventType,
  details: Record<string, unknown> = {},
): Promise<void> => {
  await pool.query(
    `INSERT INTO relationship_events (request_id,journey_id,actor_user_id,event_type,details)
     SELECT request.id,journey.id,$2,$3,$4::jsonb
     FROM engagement_requests request
     LEFT JOIN journeys journey ON journey.request_id=request.id
     WHERE request.id=$1`,
    [requestId, actorUserId, eventType, JSON.stringify(details)],
  );
};

export const recordJourneyEvent = async (
  journeyId: string,
  actorUserId: string | null,
  eventType: RelationshipEventType,
  details: Record<string, unknown> = {},
): Promise<void> => {
  await pool.query(
    `INSERT INTO relationship_events (request_id,journey_id,actor_user_id,event_type,details)
     SELECT journey.request_id,journey.id,$2,$3,$4::jsonb
     FROM journeys journey WHERE journey.id=$1`,
    [journeyId, actorUserId, eventType, JSON.stringify(details)],
  );
};

export const recordPairEvent = async (
  firstUserId: string,
  secondUserId: string,
  actorUserId: string,
  eventType: RelationshipEventType,
  details: Record<string, unknown>,
): Promise<void> => {
  await pool.query(
    `INSERT INTO relationship_events (request_id,journey_id,actor_user_id,event_type,details)
     SELECT request.id,journey.id,$3,$4,$5::jsonb
     FROM engagement_requests request
     LEFT JOIN journeys journey ON journey.request_id=request.id
     WHERE request.status='accepted' AND (
       (request.sender_user_id=$1 AND request.recipient_user_id=$2)
       OR (request.sender_user_id=$2 AND request.recipient_user_id=$1))
     ORDER BY request.updated_at DESC LIMIT 1`,
    [firstUserId, secondUserId, actorUserId, eventType, JSON.stringify(details)],
  );
};
