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

export const adminActionNotificationsRouter = Router();

export const actionQuery = `
  WITH actions AS (
    SELECT 'payment:' || payment.meeting_id || ':' || payment.beneficiary_user_id || ':'
        || EXTRACT(EPOCH FROM payment.updated_at)::bigint AS action_key,
      'payments' AS page, payment.meeting_id || ':' || payment.beneficiary_user_id AS target_id,
      'تحويل شام كاش بانتظار المراجعة' AS title,
      payer.display_name || ' أرسل إثبات دفع بقيمة ' || COALESCE(payment.amount::text, '')
        || ' ' || COALESCE(payment.currency, '') AS body,
      payment.updated_at AS created_at
    FROM meeting_payment_obligations payment
    JOIN users payer ON payer.id=payment.paid_by_user_id
    WHERE payment.status='submitted' AND payment.method='sham_cash'
    UNION ALL
    SELECT 'support:' || support.id || ':' || EXTRACT(EPOCH FROM support.updated_at)::bigint,
      'support',support.id::text,'طلب دعم يحتاج إلى متابعة',
      account.display_name || ' ينتظر رد فريق الدعم',support.updated_at
    FROM support_requests support JOIN users account ON account.id=support.user_id
    WHERE support.status IN ('requested','reschedule_requested')
    UNION ALL
    SELECT 'identity:' || submission.id || ':' || EXTRACT(EPOCH FROM submission.submitted_at)::bigint,
      'identity',submission.id::text,'طلب توثيق هوية جديد',
      account.display_name || ' أرسل صور الهوية للمراجعة',submission.submitted_at
    FROM identity_verification_submissions submission JOIN users account ON account.id=submission.user_id
    WHERE submission.status='reviewing'
    UNION ALL
    SELECT 'guardian:' || invitation.id,'guardians',invitation.id::text,'وليّ أمر بانتظار التوثيق',
      guardian.display_name || ' مرتبط بحساب ' || candidate.display_name,invitation.created_at
    FROM guardian_invitations invitation
    JOIN users candidate ON candidate.id=invitation.candidate_user_id
    JOIN users guardian ON guardian.id=invitation.accepted_by
    WHERE invitation.status='registered'
    UNION ALL
    SELECT 'representative:' || exception.id,'representatives',exception.id::text,'طلب ممثل يحتاج إلى تحقق',
      candidate.display_name || ' أضاف ممثلًا لوليّ الأمر',exception.created_at
    FROM guardian_exceptions exception JOIN users candidate ON candidate.id=exception.candidate_user_id
    WHERE exception.status='pending' AND EXISTS (
      SELECT 1 FROM guardian_representative_invitations invitation
      WHERE invitation.exception_id=exception.id AND invitation.status='accepted'
    )
    UNION ALL
    SELECT 'correction:' || correction.id,'corrections',correction.id::text,'طلب تصحيح بيانات مقفلة',
      account.display_name || ' طلب تصحيح بيانات ملفه',correction.created_at
    FROM profile_corrections correction JOIN users account ON account.id=correction.user_id
    WHERE correction.status='pending'
    UNION ALL
    SELECT 'report:' || report.id,'safety',report.id::text,'بلاغ جديد يحتاج إلى مراجعة',
      account.display_name || ' أرسل بلاغًا جديدًا',report.created_at
    FROM safety_reports report JOIN users account ON account.id=report.reporter_user_id
    WHERE report.status IN ('open','reviewing')
  )
  SELECT actions.action_key AS "key",actions.page,actions.target_id AS "targetId",
    actions.title,actions.body,actions.created_at AS "createdAt",
    receipt.delivered_at AS "deliveredAt",receipt.opened_at AS "openedAt"
  FROM actions
  LEFT JOIN admin_action_notification_receipts receipt
    ON receipt.admin_user_id=$1 AND receipt.action_key=actions.action_key
  ORDER BY actions.created_at DESC LIMIT 100`;

adminActionNotificationsRouter.get('/action-notifications', requireAuth, requireAdmin,
  async (request: AuthenticatedRequest, response) => {
    const result = await pool.query(actionQuery, [request.authUser!.id]);
    response.setHeader('Cache-Control', 'no-store');
    response.json({ actions: result.rows });
  });

const keysSchema = z.object({ keys: z.array(z.string().min(3).max(300)).min(1).max(100) });

adminActionNotificationsRouter.post('/action-notifications/delivered', requireAuth, requireAdmin,
  async (request: AuthenticatedRequest, response) => {
    const parsed = keysSchema.safeParse(request.body);
    if (!parsed.success) { response.status(400).json({ error: 'Invalid action keys' }); return; }
    await pool.query(
      `INSERT INTO admin_action_notification_receipts (admin_user_id,action_key,delivered_at)
       SELECT $1,item,NOW() FROM UNNEST($2::text[]) item
       ON CONFLICT (admin_user_id,action_key) DO UPDATE
       SET delivered_at=COALESCE(admin_action_notification_receipts.delivered_at,EXCLUDED.delivered_at)`,
      [request.authUser!.id, parsed.data.keys],
    );
    response.json({ delivered: true });
  });

adminActionNotificationsRouter.post('/action-notifications/opened', requireAuth, requireAdmin,
  async (request: AuthenticatedRequest, response) => {
    const parsed = z.object({ key: z.string().min(3).max(300) }).safeParse(request.body);
    if (!parsed.success) { response.status(400).json({ error: 'Invalid action key' }); return; }
    await pool.query(
      `INSERT INTO admin_action_notification_receipts (admin_user_id,action_key,delivered_at,opened_at)
       VALUES ($1,$2,NOW(),NOW()) ON CONFLICT (admin_user_id,action_key) DO UPDATE
       SET delivered_at=COALESCE(admin_action_notification_receipts.delivered_at,NOW()),opened_at=NOW()`,
      [request.authUser!.id, parsed.data.key],
    );
    response.json({ opened: true });
  });
