import { Router, Request, Response } from 'express';
import { prisma } from '../../config/database';
import { ROLE_DESCRIPTIONS, ROLE_PORTAL_MAP } from '@saferoute/constants';

const router = Router();

const ALL_ROLES = [
  'OWNER', 'CTO', 'COO', 'VP_OPERATIONS', 'FINANCE_MANAGER',
  'SUPPORT_EXECUTIVE', 'HARDWARE_TECHNICIAN',
  'SCHOOL_TRANSPORT_ADMIN', 'SCHOOL_FLEET_MANAGER',
  'DRIVER', 'ATTENDANT', 'PARENT',
];

const ROLE_PORTAL: Record<string, string> = {
  OWNER: 'COMPANY', CTO: 'COMPANY', COO: 'COMPANY',
  VP_OPERATIONS: 'COMPANY', FINANCE_MANAGER: 'COMPANY',
  SUPPORT_EXECUTIVE: 'COMPANY', HARDWARE_TECHNICIAN: 'COMPANY',
  SCHOOL_TRANSPORT_ADMIN: 'SCHOOL', SCHOOL_FLEET_MANAGER: 'SCHOOL',
  DRIVER: 'DRIVER_APP', ATTENDANT: 'DRIVER_APP', PARENT: 'PARENT_APP',
};

const ROLE_DESC: Record<string, string> = {
  OWNER: 'Platform Owner - Full access',
  CTO: 'Chief Technology Officer',
  COO: 'Chief Operating Officer',
  VP_OPERATIONS: 'VP Operations',
  FINANCE_MANAGER: 'Finance Manager',
  SUPPORT_EXECUTIVE: 'Support Executive',
  HARDWARE_TECHNICIAN: 'Hardware Technician',
  SCHOOL_TRANSPORT_ADMIN: 'School Transport Administrator',
  SCHOOL_FLEET_MANAGER: 'School Fleet Manager',
  DRIVER: 'Vehicle Driver',
  ATTENDANT: 'Vehicle Attendant',
  PARENT: 'Parent / Guardian',
};

// GET /api/v1/setup/status - Check if setup is already done
router.get('/status', async (_req: Request, res: Response) => {
  const ownerRole = await prisma.roleModel.findUnique({ where: { name: 'OWNER' } });
  if (!ownerRole) {
    res.json({ success: true, data: { setupDone: false } });
    return;
  }

  const ownerAssignment = await prisma.userRole.findFirst({
    where: { roleId: ownerRole.id },
    include: { user: true },
  });

  res.json({
    success: true,
    data: {
      setupDone: !!ownerAssignment,
      ownerPhone: ownerAssignment?.user?.phone || null,
    },
  });
});

// POST /api/v1/setup/init - One-time setup
router.post('/init', async (req: Request, res: Response) => {
  const { fullName, phone, setupKey } = req.body;

  // Simple protection - must match env variable
  const expectedKey = process.env.SETUP_KEY || 'saferoute-setup-2026';
  if (setupKey !== expectedKey) {
    res.status(403).json({ success: false, message: 'Invalid setup key' });
    return;
  }

  if (!fullName || !phone) {
    res.status(400).json({ success: false, message: 'Full name and phone are required' });
    return;
  }

  // Check if OWNER already exists
  const existingOwnerRole = await prisma.roleModel.findUnique({ where: { name: 'OWNER' } });
  if (existingOwnerRole) {
    const existingOwner = await prisma.userRole.findFirst({ where: { roleId: existingOwnerRole.id } });
    if (existingOwner) {
      res.status(400).json({ success: false, message: 'Setup already completed. OWNER user exists.' });
      return;
    }
  }

  // Step 1: Create all roles
  let rolesCreated = 0;
  for (const roleName of ALL_ROLES) {
    const existing = await prisma.roleModel.findUnique({ where: { name: roleName } });
    if (!existing) {
      await prisma.roleModel.create({
        data: {
          name: roleName,
          description: ROLE_DESC[roleName] || roleName,
          portalType: ROLE_PORTAL[roleName] || 'COMPANY',
        },
      });
      rolesCreated++;
    }
  }

  // Step 2: Create user
  const formatted = phone.startsWith('+') ? phone : `+91${phone}`;
  let user = await prisma.user.findUnique({ where: { phone: formatted } });
  if (!user) {
    user = await prisma.user.create({
      data: { phone: formatted, fullName, isActive: true },
    });
  }

  // Step 3: Assign OWNER role
  const ownerRole = await prisma.roleModel.findUnique({ where: { name: 'OWNER' } });
  if (ownerRole) {
    const existing = await prisma.userRole.findFirst({
      where: { userId: user.id, roleId: ownerRole.id },
    });
    if (!existing) {
      await prisma.userRole.create({
        data: { userId: user.id, roleId: ownerRole.id },
      });
    }
  }

  res.json({
    success: true,
    message: 'Setup completed successfully',
    data: {
      rolesCreated,
      user: { id: user.id, fullName: user.fullName, phone: user.phone },
      role: 'OWNER',
    },
  });
});

export default router;
