<?php
require_once __DIR__.'/../../config/auth.php';require_once __DIR__.'/helpers.php';
$accion=$_GET['accion']??'lista';$id=filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT)?:0;$error='';
if($_SERVER['REQUEST_METHOD']==='POST'){
 try{
  $tipo=$_POST['tipo_accion']??'proyecto';
  if($tipo==='area'){$pid=(int)$_POST['proyecto_id'];$a=limpiar($_POST['area']);$r=limpiar($_POST['rol']);$s=$conn->prepare('INSERT INTO proyecto_areas(proyecto_id,area,rol) VALUES(?,?,?)');$s->bind_param('iss',$pid,$a,$r);$s->execute();header("Location:?accion=ver&id=$pid");exit;}
  if($tipo==='objetivo'){$pid=(int)$_POST['proyecto_id'];$cat=$_POST['categoria']??'';if(!in_array($cat,['Alcance','Tiempo','Costo'],true))throw new RuntimeException('Categoría inválida.');$o=limpiar($_POST['objetivo']);$c=limpiar($_POST['criterio_exito']);$f=$_POST['fecha_exito']?:null;$existe=$conn->prepare('SELECT id FROM proyecto_objetivos WHERE proyecto_id=? AND categoria=?');$existe->bind_param('is',$pid,$cat);$existe->execute();if($existe->get_result()->fetch_assoc())throw new RuntimeException("El objetivo de $cat ya fue cargado.");$existe->close();$s=$conn->prepare('INSERT INTO proyecto_objetivos(proyecto_id,categoria,objetivo,criterio_exito,fecha_exito) VALUES(?,?,?,?,?)');$s->bind_param('issss',$pid,$cat,$o,$c,$f);$s->execute();header("Location:?accion=ver&id=$pid");exit;}
  if($tipo==='hito'){$pid=(int)$_POST['proyecto_id'];$d=limpiar($_POST['descripcion']);$f=$_POST['fecha_vencimiento'];$e=$_POST['estado'];$s=$conn->prepare('INSERT INTO proyecto_hitos(proyecto_id,descripcion,fecha_vencimiento,estado) VALUES(?,?,?,?)');$s->bind_param('isss',$pid,$d,$f,$e);$s->execute();header("Location:?accion=ver&id=$pid");exit;}
  if($tipo==='seguimiento'){$hid=(int)$_POST['hito_id'];$pid=(int)$_POST['proyecto_id'];$seg=limpiar($_POST['seguimiento']);$img=guardar_archivo_movimiento('imagen','proyectos',true);$s=$conn->prepare('INSERT INTO proyecto_hito_seguimientos(hito_id,seguimiento,imagen) VALUES(?,?,?)');$s->bind_param('iss',$hid,$seg,$img);$s->execute();header("Location:?accion=seguimiento&id=$pid&hito_id=$hid");exit;}
  $id=(int)($_POST['id']??0);$nombre=limpiar($_POST['nombre']);$desc=limpiar($_POST['descripcion']);$lider=limpiar($_POST['lider']);$sponsor=limpiar($_POST['sponsor']);$req=limpiar($_POST['requisitos']);$alc=limpiar($_POST['alcance']);$fecha=$_POST['fecha_objetivo']?:null;$costo=numero_entero($_POST['costo']??0);$fin=limpiar($_POST['finalidad']);$jus=limpiar($_POST['justificacion']);$ame=limpiar($_POST['amenazas']);$estado=$_POST['estado'];
  if($nombre==='')throw new RuntimeException('El nombre es obligatorio.');
  if($id){$s=$conn->prepare('UPDATE proyectos SET nombre=?,descripcion=?,lider=?,sponsor=?,requisitos=?,alcance=?,fecha_objetivo=?,costo=?,finalidad=?,justificacion=?,amenazas=?,estado=? WHERE id=?');$s->bind_param('sssssssdssssi',$nombre,$desc,$lider,$sponsor,$req,$alc,$fecha,$costo,$fin,$jus,$ame,$estado,$id);}else{$s=$conn->prepare('INSERT INTO proyectos(nombre,descripcion,lider,sponsor,requisitos,alcance,fecha_objetivo,costo,finalidad,justificacion,amenazas,estado) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)');$s->bind_param('sssssssdssss',$nombre,$desc,$lider,$sponsor,$req,$alc,$fecha,$costo,$fin,$jus,$ame,$estado);}
  $s->execute();$nuevo=$id?:$s->insert_id;header("Location:?accion=ver&id=$nuevo");exit;
 }catch(Throwable $e){$error=$e->getMessage();}
}
$d=['nombre'=>'','descripcion'=>'','lider'=>'','sponsor'=>'','requisitos'=>'','alcance'=>'','fecha_objetivo'=>'','costo'=>0,'finalidad'=>'','justificacion'=>'','amenazas'=>'','estado'=>'Pendiente'];
if($id){$s=$conn->prepare('SELECT * FROM proyectos WHERE id=?');$s->bind_param('i',$id);$s->execute();$d=$s->get_result()->fetch_assoc()?:$d;$s->close();}
$vencido=($d['fecha_objetivo']??'')&&$d['fecha_objetivo']<date('Y-m-d')&&in_array($d['estado'],['Pendiente','En Proceso']);
include __DIR__.'/../../includes/header.php';include __DIR__.'/../../includes/sidebar.php';
?>
<main class="main"><?php include __DIR__.'/../../includes/topbar.php';?><div class="content">
<?php if($accion==='lista'):$lista=$conn->query("SELECT *, (fecha_objetivo<CURDATE() AND estado IN('Pendiente','En Proceso')) vencido FROM proyectos ORDER BY id DESC");?>
<div class="d-flex justify-content-between mb-4"><div><h3 class="page-title">Proyectos</h3><p class="text-muted">Búsqueda y gestión integral.</p></div><a class="btn btn-hm" href="?accion=nuevo">Nuevo proyecto</a></div><input id="buscar" class="form-control mb-3" placeholder="Buscar por proyecto"><div class="row g-3" id="proyectos"><?php while($p=$lista->fetch_assoc()):?><div class="col-md-6 col-xl-4 proyecto"><a class="module-card <?=$p['vencido']?'border border-danger bg-danger-subtle':''?>" href="?accion=ver&id=<?=$p['id']?>"><div class="icon"><i class="fa fa-diagram-project"></i></div><h5><?=e($p['nombre'])?></h5><p><?=e($p['estado'])?> · Meta: <?=e($p['fecha_objetivo']?:'Sin fecha')?></p></a></div><?php endwhile;?></div><script>buscar.oninput=()=>document.querySelectorAll('.proyecto').forEach(x=>x.style.display=x.innerText.toLowerCase().includes(buscar.value.toLowerCase())?'':'none');</script>
<?php elseif($accion==='ver'&&$id):
$areas=$conn->query("SELECT * FROM proyecto_areas WHERE proyecto_id=$id");$objs=$conn->query("SELECT * FROM proyecto_objetivos WHERE proyecto_id=$id");$categoriasCargadas=[];$rc=$conn->query("SELECT categoria FROM proyecto_objetivos WHERE proyecto_id=$id");while($fc=$rc->fetch_assoc())$categoriasCargadas[]=$fc['categoria'];$categoriasDisponibles=array_values(array_diff(['Alcance','Tiempo','Costo'],$categoriasCargadas));$hitos=$conn->query("SELECT *, (fecha_vencimiento<CURDATE() AND estado IN('Pendiente','En Proceso')) vencido FROM proyecto_hitos WHERE proyecto_id=$id ORDER BY fecha_vencimiento");?>
<a href="?">← Volver</a><div class="d-flex justify-content-between my-3"><h3 class="page-title <?=$vencido?'text-danger':''?>"><?=e($d['nombre'])?></h3><a class="btn btn-outline-primary" href="?accion=editar&id=<?=$id?>">Editar</a></div>
<div class="card card-hm mb-3"><div class="card-body"><span class="badge <?=$vencido?'bg-danger':'bg-primary'?>"><?=e($d['estado'])?></span><p class="mt-3"><?=nl2br(e($d['descripcion']))?></p><div class="row"><div class="col-md-6"><b>Líder:</b> <?=e($d['lider'])?></div><div class="col-md-6"><b>Sponsor:</b> <?=e($d['sponsor'])?></div><div class="col-md-6"><b>Fecha objetivo:</b> <?=e($d['fecha_objetivo'])?></div><div class="col-md-6"><b>Costo:</b> Gs. <?=numero_py($d['costo'])?></div></div><hr><b>Requisitos</b><p><?=nl2br(e($d['requisitos']))?></p><b>Alcance</b><p><?=nl2br(e($d['alcance']))?></p><b>Finalidad</b><p><?=nl2br(e($d['finalidad']))?></p><b>Justificación</b><p><?=nl2br(e($d['justificacion']))?></p><b>Amenazas</b><p><?=nl2br(e($d['amenazas']))?></p></div></div>
<div class="row g-3"><div class="col-lg-6"><div class="card card-hm h-100"><div class="card-body"><h5>Áreas participantes</h5><?php while($a=$areas->fetch_assoc()):?><p><b><?=e($a['area'])?>:</b> <?=e($a['rol'])?></p><?php endwhile;?><form method="post"><input type="hidden" name="tipo_accion" value="area"><input type="hidden" name="proyecto_id" value="<?=$id?>"><input class="form-control mb-2" name="area" placeholder="Área" required><input class="form-control mb-2" name="rol" placeholder="Rol que desempeña" required><button class="btn btn-sm btn-hm">Agregar</button></form></div></div></div>
<div class="col-lg-6"><div class="card card-hm h-100"><div class="card-body"><h5>Objetivos y criterios de éxito</h5><?php while($o=$objs->fetch_assoc()):?><p><b><?=e($o['categoria'])?>:</b> <?=e($o['objetivo'])?><br><small>Éxito: <?=e($o['criterio_exito'])?> <?=e($o['fecha_exito'])?></small></p><?php endwhile;?><?php if($categoriasDisponibles):?><form method="post"><input type="hidden" name="tipo_accion" value="objetivo"><input type="hidden" name="proyecto_id" value="<?=$id?>"><select class="form-select mb-2" name="categoria"><?php foreach($categoriasDisponibles as $o):?><option><?=$o?></option><?php endforeach;?></select><textarea class="form-control mb-2" name="objetivo" placeholder="Objetivo" required></textarea><textarea class="form-control mb-2" name="criterio_exito" placeholder="Criterio de éxito" required></textarea><input class="form-control mb-2" type="date" name="fecha_exito"><button class="btn btn-sm btn-hm">Agregar</button></form><?php else:?><div class="alert alert-success mb-0">Ya fueron cargados los objetivos de Alcance, Tiempo y Costo.</div><?php endif;?></div></div></div></div>
<h4 class="page-title mt-4">Cronograma e hitos</h4><?php while($h=$hitos->fetch_assoc()):$hid=(int)$h['id'];?><div class="card mb-3 <?=$h['vencido']?'border-danger bg-danger-subtle':''?>"><div class="card-body d-flex flex-wrap justify-content-between align-items-center gap-3"><div><h5 class="mb-1"><?=e($h['descripcion'])?></h5><p class="mb-0"><b>Vencimiento:</b> <?=e($h['fecha_vencimiento'])?> · <b>Estado:</b> <?=e($h['estado'])?></p></div><a class="btn btn-sm btn-outline-primary no-print" href="?accion=seguimiento&id=<?=$id?>&hito_id=<?=$hid?>"><i class="fa fa-comments me-1"></i>Dar seguimiento</a></div></div><?php endwhile;?>
<div class="card card-hm"><div class="card-body"><h5>Nuevo hito</h5><form class="row g-2" method="post"><input type="hidden" name="tipo_accion" value="hito"><input type="hidden" name="proyecto_id" value="<?=$id?>"><div class="col-md-5"><input class="form-control" name="descripcion" placeholder="Descripción breve" required></div><div class="col-md-3"><input class="form-control" type="date" name="fecha_vencimiento" required></div><div class="col-md-2"><select class="form-select" name="estado"><?php foreach(['Pendiente','En Proceso','Finalizado','Cancelado'] as $o):?><option><?=$o?></option><?php endforeach;?></select></div><div class="col-md-2"><button class="btn btn-hm">Agregar</button></div></form></div></div>
<?php elseif($accion==='seguimiento'&&$id):
$hitoId=filter_input(INPUT_GET,'hito_id',FILTER_VALIDATE_INT)?:0;$sh=$conn->prepare('SELECT * FROM proyecto_hitos WHERE id=? AND proyecto_id=?');$sh->bind_param('ii',$hitoId,$id);$sh->execute();$hito=$sh->get_result()->fetch_assoc();$sh->close();if(!$hito){http_response_code(404);exit('Hito no encontrado.');}$ss=$conn->prepare('SELECT * FROM proyecto_hito_seguimientos WHERE hito_id=? ORDER BY creado_en DESC');$ss->bind_param('i',$hitoId);$ss->execute();$seguimientos=$ss->get_result();?>
<a href="?accion=ver&id=<?=$id?>">← Volver al proyecto</a><h3 class="page-title my-3">Seguimiento del hito</h3><div class="card card-hm mb-3"><div class="card-body"><h5><?=e($hito['descripcion'])?></h5><p class="mb-0"><b>Vencimiento:</b> <?=e($hito['fecha_vencimiento'])?> · <b>Estado:</b> <?=e($hito['estado'])?></p></div></div>
<div class="card card-hm mb-3"><div class="card-body"><h5>Cargar seguimiento</h5><form method="post" enctype="multipart/form-data"><input type="hidden" name="tipo_accion" value="seguimiento"><input type="hidden" name="proyecto_id" value="<?=$id?>"><input type="hidden" name="hito_id" value="<?=$hitoId?>"><textarea class="form-control mb-2" name="seguimiento" rows="4" placeholder="Detalle del seguimiento" required></textarea><label class="form-label">Imagen opcional</label><input class="form-control mb-2" type="file" name="imagen" accept="image/*"><button class="btn btn-hm">Guardar seguimiento</button></form></div></div>
<h5>Historial de seguimientos</h5><?php while($x=$seguimientos->fetch_assoc()):?><div class="card mb-2"><div class="card-body"><small><?=e($x['creado_en'])?></small><p><?=nl2br(e($x['seguimiento']))?></p><?php if($x['imagen']):?><img src="<?=e($x['imagen'])?>" style="max-height:240px;max-width:100%"><?php endif;?></div></div><?php endwhile;$ss->close();?>
<?php else:?>
<a href="?">← Volver</a><h3 class="page-title my-3"><?=$id?'Editar':'Nuevo'?> proyecto</h3><?php if($error):?><div class="alert alert-danger"><?=e($error)?></div><?php endif;?><div class="card card-hm"><div class="card-body"><form method="post"><input type="hidden" name="id" value="<?=$id?>"><div class="row g-3"><div class="col-12"><label>Nombre del Proyecto *</label><input class="form-control" name="nombre" value="<?=e($d['nombre'])?>" required></div><?php foreach(['descripcion'=>'Descripción detallada','requisitos'=>'Definición de requisitos','alcance'=>'Alcance','finalidad'=>'Finalidad','justificacion'=>'Justificación','amenazas'=>'Amenazas'] as $k=>$l):?><div class="col-12"><label><?=$l?></label><textarea class="form-control" rows="4" name="<?=$k?>"><?=e($d[$k])?></textarea></div><?php endforeach;?><div class="col-md-6"><label>Líder del Proyecto</label><input class="form-control" name="lider" value="<?=e($d['lider'])?>"></div><div class="col-md-6"><label>Sponsor del Proyecto</label><input class="form-control" name="sponsor" value="<?=e($d['sponsor'])?>"></div><div class="col-md-4"><label>Fecha objetivo / tiempo estimado</label><input class="form-control" type="date" name="fecha_objetivo" value="<?=e($d['fecha_objetivo'])?>"></div><div class="col-md-4"><label>Costo</label><input class="form-control numero-miles" name="costo" value="<?=numero_py($d['costo'])?>"></div><div class="col-md-4"><label>Estado</label><select class="form-select" name="estado"><?php foreach(['Pendiente','En Proceso','Finalizado','Cancelado'] as $o):?><option <?=$d['estado']===$o?'selected':''?>><?=$o?></option><?php endforeach;?></select></div></div><button class="btn btn-hm mt-3">Guardar proyecto</button></form></div></div>
<?php endif;?></div></main><?php include __DIR__.'/../../includes/footer.php';?>
