import { Router, type Response } from 'express';
import { z } from 'zod';
import { requireAuth, type AuthenticatedRequest } from './auth';
import { pool } from './db';
import { profileFields } from './sharedJourney';

export const relationshipWorkspaceRouter = Router();

const requireCandidate = (request: AuthenticatedRequest, response: Response): string | null => {
  if (request.authUser?.role === 'user' && request.authUser.accountType === 'candidate') {
    return request.authUser.id;
  }
  response.status(403).json({ error: 'Candidate account required' });
  return null;
};

relationshipWorkspaceRouter.get('/requests/:id/workspace', requireAuth,
  async (request: AuthenticatedRequest, response) => {
    const actorId = requireCandidate(request, response);
    const requestId = z.uuid().safeParse(request.params.id);
    if (!actorId || !requestId.success) {
      if (actorId) response.status(400).json({ error: 'Invalid request' });
      return;
    }

    const relationship = await pool.query<{
      id: string; counterpart_user_id: string; journey_id: string | null;
    }>(
      `SELECT relationship.id,
         CASE WHEN relationship.sender_user_id=$2 THEN relationship.recipient_user_id
              ELSE relationship.sender_user_id END AS counterpart_user_id,
         journey.id AS journey_id
       FROM engagement_requests relationship
       LEFT JOIN journeys journey ON journey.request_id=relationship.id
       WHERE relationship.id=$1
         AND (relationship.sender_user_id=$2 OR relationship.recipient_user_id=$2)`,
      [requestId.data, actorId],
    );
    const row = relationship.rows[0];
    if (!row) { response.status(404).json({ error: 'Request not found' }); return; }

    const [profile, events, incomingPhotoRequest] = await Promise.all([
      pool.query(`SELECT ${profileFields} FROM profiles p WHERE p.user_id=$1`, [row.counterpart_user_id]),
      pool.query(
        `SELECT event.id,event.event_type AS "type",event.actor_user_id AS "actorUserId",
           actor.display_name AS "actorName",
           CASE WHEN event.event_type='meeting_completed' AND event.details ? 'meetingId'
             THEN event.details || jsonb_build_object('durationSeconds',COALESCE((
               SELECT GREATEST(0,EXTRACT(EPOCH FROM
                 (MAX(COALESCE(session.left_at,session.last_seen_at))-MIN(session.joined_at))))::int
               FROM meeting_call_sessions session
               WHERE session.meeting_id::text=event.details->>'meetingId'),0))
             ELSE event.details END AS details,event.created_at AS "createdAt"
         FROM relationship_events event
         LEFT JOIN users actor ON actor.id=event.actor_user_id
         WHERE event.request_id=$1 ORDER BY event.created_at,event.id`,
        [row.id],
      ),
      pool.query(
        `SELECT access.viewer_user_id AS "viewerUserId",viewer.display_name AS "viewerName",
           access.updated_at AS "updatedAt"
         FROM profile_photo_access access
         JOIN users viewer ON viewer.id=access.viewer_user_id
         WHERE access.owner_user_id=$1 AND access.viewer_user_id=$2 AND access.status='requested'`,
        [actorId, row.counterpart_user_id],
      ),
    ]);
    if (!profile.rows[0]) { response.status(404).json({ error: 'Profile not found' }); return; }
    response.json({
      profile: profile.rows[0],
      events: events.rows,
      incomingPhotoRequest: incomingPhotoRequest.rows[0] ?? null,
    });
  });
