<?php
declare(strict_types=1);
require __DIR__.'/lib.php';
if(!app_installed())redirect('install.php');boot_session();
$cfg=config();$step=(int)($_SESSION['registration_step']??1);$message='';$error='';$success=false;
if($_SERVER['REQUEST_METHOD']==='POST'){
 verify_csrf();$action=(string)($_POST['action']??'');
 try{
  if($action==='start'){
   if(!rate_limit('registration_start',5,1800))throw new RuntimeException('Demasiados intentos. Espere antes de volver a intentarlo.');
   $teacher=teacher_by_identity((string)($_POST['cedula']??''),(string)($_POST['personal_email']??''));
   if(!$teacher){audit('registration_identity_failed');throw new RuntimeException('No fue posible validar los datos. Verifique la información o comuníquese con la institución.');}
   if($teacher['status']==='active'){$_SESSION['active_email']=$teacher['institutional_email'];$step=5;$_SESSION['registration_step']=5;}
   else{$otp=generate_otp((int)$teacher['id']);if(!send_registration_otp($teacher,$otp)){audit('otp_send_failed',(int)$teacher['id']);throw new RuntimeException('No se pudo enviar el código. Verifique la configuración de correo del servidor.');}
    $_SESSION['teacher_id']=(int)$teacher['id'];$_SESSION['registration_step']=2;$step=2;audit('otp_sent',(int)$teacher['id']);$message='Enviamos un código temporal al correo personal autorizado '.mask_email(decrypt_value($teacher['personal_email_enc'])).'.';}
  }
  elseif($action==='verify_otp'){
   if(!rate_limit('registration_otp',10,1800))throw new RuntimeException('Demasiados intentos. Espere antes de continuar.');
   $tid=(int)($_SESSION['teacher_id']??0);if(!$tid||!verify_otp($tid,(string)($_POST['otp']??'')))throw new RuntimeException('Código inválido o vencido.');
   $_SESSION['totp_secret']=generate_totp_secret();$_SESSION['registration_step']=3;$step=3;audit('otp_verified',$tid);
  }
  elseif($action==='provision'){
   $tid=(int)($_SESSION['teacher_id']??0);$secret=(string)($_SESSION['totp_secret']??'');$teacher=teacher_by_id($tid);if(!$teacher||!$secret||$step<3)throw new RuntimeException('La sesión de registro expiró.');
   $username=strtolower(trim((string)($_POST['username']??'')));$password=(string)($_POST['password']??'');$confirm=(string)($_POST['password_confirm']??'');$totp=(string)($_POST['totp']??'');
   if(!valid_username($username))throw new RuntimeException('El usuario debe comenzar por letra y usar solo minúsculas, números, punto, guion o guion bajo.');
   if(!valid_password($password))throw new RuntimeException('La contraseña debe tener al menos 12 caracteres, mayúscula, minúscula, número y símbolo.');
   if(!hash_equals($password,$confirm))throw new RuntimeException('Las contraseñas no coinciden.');
   if(!verify_totp($secret,$totp))throw new RuntimeException('Código de la aplicación autenticadora no válido.');
   if(!cpanel_configured())throw new RuntimeException('La institución aún no ha activado la conexión segura con cPanel. Sus datos no fueron guardados; solicite soporte y vuelva a intentarlo cuando esté habilitada.');
   $result=create_cpanel_mailbox($username,$password);if(!$result['ok']){audit('cpanel_provision_failed',$tid,['username'=>$username,'reason'=>$result['message']]);throw new RuntimeException('cPanel no pudo crear la cuenta: '.$result['message']);}
   $institutional=$username.'@'.$cfg['domain'];$st=db()->prepare("UPDATE teachers SET status='active',institutional_email=?,username=?,totp_secret_enc=?,verified_at=?,updated_at=? WHERE id=?");$st->execute([$institutional,$username,encrypt_value($secret),date('c'),date('c'),$tid]);
   audit('mailbox_created',$tid,['email'=>$institutional]);send_mail_message(decrypt_value($teacher['personal_email_enc']),'Cuenta institucional activada',"Su cuenta institucional ha sido creada: {$institutional}\nAcceso Webmail: {$cfg['webmail_url']}\nPor seguridad, no enviamos ni almacenamos su contraseña.\n");
   $_SESSION=[];session_regenerate_id(true);$_SESSION['active_email']=$institutional;$_SESSION['registration_step']=5;$step=5;$success=true;
  }
  elseif($action==='restart'){$_SESSION=[];session_regenerate_id(true);$_SESSION['registration_step']=1;$step=1;}
 }catch(Throwable $e){$error=$e->getMessage();}
}
$teacher=isset($_SESSION['teacher_id'])?teacher_by_id((int)$_SESSION['teacher_id']):null;$secret=(string)($_SESSION['totp_secret']??'');$issuer=rawurlencode('UEN Alberto Smith');$account=rawurlencode(($teacher['full_name']??'Docente').'@'.$cfg['domain']);$otpauth=$secret?'otpauth://totp/'.$issuer.':'.$account.'?secret='.rawurlencode($secret).'&issuer='.$issuer.'&period=30&digits=6':'';
?><!doctype html><html lang="es"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex,nofollow"><title>Registro de correo docente | U.E.N. Alberto Smith</title><link rel="icon" href="../assets/img/favicon.png"><link rel="stylesheet" href="../assets/css/styles.css"><link rel="stylesheet" href="styles.css"></head><body class="mail-app"><main class="mail-shell"><div class="mail-brand"><a href="../correo.html"><img src="../assets/img/logo.png" alt=""></a><div><b>U.E.N. Alberto Smith</b><span>Registro seguro de correo docente · 2026–2027</span></div></div><div class="progress"><span class="<?=($step>=1?'on':'')?>">1. Identidad</span><span class="<?=($step>=2?'on':'')?>">2. Código</span><span class="<?=($step>=3?'on':'')?>">3. 2FA y cuenta</span><span class="<?=($step>=5?'on':'')?>">4. Activada</span></div><section class="mail-panel"><?php if($message):?><div class="alert success"><?=h($message)?></div><?php endif;?><?php if($error):?><div class="alert error"><?=h($error)?></div><?php endif;?>
<?php if($step===1):?><h1>Validar autorización docente</h1><p>Solo pueden continuar los profesores cuya cédula y correo personal estén previamente registrados por la institución.</p><form method="post" class="mail-form"><input type="hidden" name="csrf" value="<?=h(csrf_token())?>"><input type="hidden" name="action" value="start"><label>Número de cédula<input name="cedula" inputmode="numeric" autocomplete="off" required placeholder="Solo números"></label><label>Correo personal autorizado<input type="email" name="personal_email" autocomplete="email" required></label><button class="btn btn-red" type="submit">Validar y enviar código</button></form><div class="privacy-note">La cédula se transforma en una huella criptográfica antes de almacenarse. No se muestra en directorios públicos.</div>
<?php elseif($step===2):?><h1>Verificar código temporal</h1><p>Ingrese el código de seis dígitos enviado al correo personal autorizado. Vence en 10 minutos.</p><form method="post" class="mail-form"><input type="hidden" name="csrf" value="<?=h(csrf_token())?>"><input type="hidden" name="action" value="verify_otp"><label>Código OTP<input name="otp" inputmode="numeric" pattern="[0-9]{6}" maxlength="6" required class="otp-input" autocomplete="one-time-code"></label><button class="btn btn-red" type="submit">Comprobar código</button></form>
<?php elseif($step===3):?><h1>Crear cuenta y activar segundo factor</h1><p>Registre la clave siguiente en Google Authenticator, Microsoft Authenticator, Authy u otra aplicación TOTP. Luego introduzca el código que genere la aplicación.</p><div class="totp-box"><b>Clave manual TOTP</b><code><?=h($secret)?></code><a class="btn btn-outline-dark" href="<?=h($otpauth)?>">Abrir en aplicación autenticadora</a></div><form method="post" class="mail-form"><input type="hidden" name="csrf" value="<?=h(csrf_token())?>"><input type="hidden" name="action" value="provision"><label>Usuario deseado<input name="username" required pattern="[a-z][a-z0-9._-]{2,29}" autocomplete="username" placeholder="nombre.apellido"><small>La cuenta será usuario@<?=h($cfg['domain'])?></small></label><div class="form-two"><label>Contraseña<input type="password" name="password" required autocomplete="new-password"></label><label>Confirmar contraseña<input type="password" name="password_confirm" required autocomplete="new-password"></label></div><small class="password-help">Mínimo 12 caracteres con mayúscula, minúscula, número y símbolo. La contraseña se envía directamente a cPanel y no se almacena en este módulo.</small><label>Código actual de la aplicación 2FA<input name="totp" inputmode="numeric" pattern="[0-9]{6}" maxlength="6" required class="otp-input" autocomplete="one-time-code"></label><button class="btn btn-red" type="submit">Crear cuenta institucional</button></form>
<?php elseif($step===5):$active=(string)($_SESSION['active_email']??'');?><h1>Cuenta institucional activa</h1><div class="mail-success-icon">✓</div><p>Su cuenta es <strong><?=h($active)?></strong>.</p><p><a class="btn btn-red" href="<?=h($cfg['webmail_url'])?>" target="_blank" rel="noopener noreferrer">Abrir Webmail cPanel</a></p><form method="post"><input type="hidden" name="csrf" value="<?=h(csrf_token())?>"><input type="hidden" name="action" value="restart"><button class="text-button" type="submit">Iniciar otra validación</button></form><?php endif;?></section><footer class="mail-footer"><a href="../correo.html">Volver a Correo Institucional</a><span>·</span><a href="../contacto.html#formulario">Soporte</a><span>·</span><a href="admin.php">Administración</a></footer></main></body></html>
