<?php
require_once __DIR__.'/../../config/auth.php';
$accion=$_GET['accion']??'lista'; $id=(int)($_GET['id']??0); $error='';

if($_SERVER['REQUEST_METHOD']==='POST'){
 $tipo=$_POST['tipo']??'factura';
 if($tipo==='eliminar'){
  $fid=(int)$_POST['factura_id']; $s=$conn->prepare('DELETE FROM facturas WHERE id=?');$s->bind_param('i',$fid);$s->execute();
  header('Location: /HM/modules/movimientos/facturacion.php?eliminada=1');exit;
 }
 if($tipo==='pago'){
  $fid=(int)$_POST['factura_id'];
  $f=$conn->query("SELECT importe-COALESCE((SELECT SUM(importe) FROM factura_pagos WHERE factura_id=$fid),0) saldo FROM facturas WHERE id=$fid")->fetch_assoc();
  $importe=numero_entero($_POST['importe']??0);
  if($f && (float)$f['saldo']>0 && $importe>0 && $importe<=(float)$f['saldo']){
   $fecha=$_POST['fecha_pago'];$obs=limpiar($_POST['observacion']);
   $s=$conn->prepare('INSERT INTO factura_pagos(factura_id,fecha_pago,importe,observacion)VALUES(?,?,?,?)');$s->bind_param('isds',$fid,$fecha,$importe,$obs);$s->execute();
   header("Location: ?accion=ver&id=$fid&pago=1");exit;
  }
  header("Location: ?accion=ver&id=$fid&error_pago=1");exit;
 }
 if($tipo==='seguimiento'){
  $fid=(int)$_POST['factura_id'];$detalle=limpiar($_POST['detalle']);
  $saldo=$conn->query("SELECT importe-COALESCE((SELECT SUM(importe) FROM factura_pagos WHERE factura_id=$fid),0) saldo FROM facturas WHERE id=$fid")->fetch_assoc();
  if($saldo && (float)$saldo['saldo']>0){$s=$conn->prepare('INSERT INTO factura_seguimientos(factura_id,detalle)VALUES(?,?)');$s->bind_param('is',$fid,$detalle);$s->execute();}
  header("Location: ?accion=ver&id=$fid&seguimiento=1");exit;
 }

 $id=(int)($_POST['id']??0);$cliente=(int)($_POST['cliente_id']??0);$numero=limpiar($_POST['nro_factura']??'');
 $fecha=$_POST['fecha_factura']?:null;$condicion=in_array($_POST['condicion']??'', ['Contado','Credito'],true)?$_POST['condicion']:null;
 $observacion=limpiar($_POST['observacion']??'');$lineas=[];$exentas=$iva5=$iva10=0;
 for($i=0;$i<8;$i++){
  $descripcion=limpiar($_POST['descripcion'][$i]??'');$cantidad=numero_entero($_POST['cantidad'][$i]??0);
  $precio=numero_entero($_POST['precio_unitario'][$i]??0);$ex=numero_entero($_POST['exentas'][$i]??0);
  $i5=numero_entero($_POST['iva5'][$i]??0);$i10=numero_entero($_POST['iva10'][$i]??0);
  if($descripcion!==''||$cantidad||$precio||$ex||$i5||$i10)$lineas[]=[$i+1,$cantidad,$descripcion,$precio,$ex,$i5,$i10];
  $exentas+=$ex;$iva5+=$i5;$iva10+=$i10;
 }
 if(!$cliente)$error='Debe seleccionar un cliente.';
 elseif(empty($lineas)||$lineas[0][0]!==1||$lineas[0][1]<=0||$lineas[0][2]===''||$lineas[0][3]<=0||($lineas[0][4]+$lineas[0][5]+$lineas[0][6])<=0)$error='Debe completar la primera fila: cantidad, descripción, precio unitario y al menos una columna de importe.';
 if(!$error){
  $total=$exentas+$iva5+$iva10;$totalIva5=round($iva5/21);$totalIva10=round($iva10/11);
  $conn->begin_transaction();
  try{
   if($id){
    $s=$conn->prepare('UPDATE facturas SET cliente_id=?,nro_factura=?,fecha_factura=?,condicion=?,total_exentas=?,total_iva5=?,total_iva10=?,total_iva_5=?,total_iva_10=?,importe=?,iva=?,observacion=?,trabajo_realizado=NULL,fecha_vencimiento=NULL WHERE id=?');
    $ivaTotal=$totalIva5+$totalIva10;$s->bind_param('isssdddddddsi',$cliente,$numero,$fecha,$condicion,$exentas,$iva5,$iva10,$totalIva5,$totalIva10,$total,$ivaTotal,$observacion,$id);$s->execute();
    $conn->query("DELETE FROM factura_detalles WHERE factura_id=$id");$fid=$id;
   }else{
    $s=$conn->prepare('INSERT INTO facturas(cliente_id,nro_factura,fecha_factura,condicion,total_exentas,total_iva5,total_iva10,total_iva_5,total_iva_10,importe,iva,observacion,trabajo_realizado,fecha_vencimiento)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,NULL,NULL)');
    $ivaTotal=$totalIva5+$totalIva10;$s->bind_param('isssddddddds',$cliente,$numero,$fecha,$condicion,$exentas,$iva5,$iva10,$totalIva5,$totalIva10,$total,$ivaTotal,$observacion);$s->execute();$fid=$s->insert_id;
   }
   $sd=$conn->prepare('INSERT INTO factura_detalles(factura_id,orden,cantidad,descripcion,precio_unitario,exentas,iva5,iva10)VALUES(?,?,?,?,?,?,?,?)');
   foreach($lineas as $l){[$orden,$cantidad,$descripcion,$precio,$ex,$i5,$i10]=$l;$sd->bind_param('iiisdddd',$fid,$orden,$cantidad,$descripcion,$precio,$ex,$i5,$i10);$sd->execute();}
   $conn->commit();header("Location: ?accion=ver&id=$fid&guardada=1");exit;
  }catch(Throwable $e){$conn->rollback();$error='No fue posible guardar la factura.';}
 }
}

$factura=['cliente_id'=>'','nro_factura'=>'','fecha_factura'=>'','condicion'=>'','importe'=>0,'iva'=>0,'total_exentas'=>0,'total_iva5'=>0,'total_iva10'=>0,'total_iva_5'=>0,'total_iva_10'=>0,'observacion'=>''];
$detalles=[];
if($id){
 $s=$conn->prepare('SELECT * FROM facturas WHERE id=?');$s->bind_param('i',$id);$s->execute();$hallada=$s->get_result()->fetch_assoc();
 if(!$hallada){header('Location: /HM/modules/movimientos/facturacion.php');exit;}$factura=$hallada;
 $r=$conn->query("SELECT * FROM factura_detalles WHERE factura_id=$id ORDER BY orden");while($x=$r->fetch_assoc())$detalles[(int)$x['orden']]=$x;
}
$clientes=$conn->query("SELECT id,nombre FROM clientes WHERE estado='Activo' ORDER BY nombre");
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 f.*,c.nombre cliente,COALESCE(SUM(p.importe),0) pagado,f.importe-COALESCE(SUM(p.importe),0) saldo FROM facturas f JOIN clientes c ON c.id=f.cliente_id LEFT JOIN factura_pagos p ON p.factura_id=f.id GROUP BY f.id ORDER BY f.id DESC");?>
<?php if(isset($_GET['eliminada'])):?><div class="alert alert-success">La factura y sus movimientos fueron eliminados.</div><?php endif;?>
<div class="d-flex justify-content-between"><h3 class="page-title">Facturación</h3><a class="btn btn-hm" href="?accion=nuevo">Nueva factura</a></div>
<input id="buscar" class="form-control my-3" placeholder="Buscar"><div class="card card-hm"><div class="card-body table-responsive"><table class="table" id="tabla"><thead><tr><th>Cliente</th><th>Fecha de emisión</th><th>Nro.</th><th>Condición</th><th class="text-end">Importe</th><th class="text-end">Pagado</th><th class="text-end">Saldo</th><th></th></tr></thead><tbody>
<?php while($f=$lista->fetch_assoc()):?><tr><td><?=e($f['cliente'])?></td><td><?=e($f['fecha_factura']?:'—')?></td><td><?=e($f['nro_factura']?:'Sin factura')?></td><td><?=e($f['condicion']==='Credito'?'Crédito':($f['condicion']?:'—'))?></td><td class="text-end"><?=numero_py($f['importe'])?></td><td class="text-end"><?=numero_py($f['pagado'])?></td><td class="text-end"><?=numero_py($f['saldo'])?></td><td><a class="btn btn-sm btn-outline-primary" href="?accion=ver&id=<?=$f['id']?>">Abrir</a></td></tr><?php endwhile;?>
</tbody></table></div></div><script>buscar.oninput=()=>document.querySelectorAll('#tabla tbody tr').forEach(x=>x.style.display=x.innerText.toLowerCase().includes(buscar.value.toLowerCase())?'':'none');</script>

<?php elseif($accion==='ver'):
$pagos=$conn->query("SELECT * FROM factura_pagos WHERE factura_id=$id ORDER BY fecha_pago DESC,id DESC");$seguimientos=$conn->query("SELECT * FROM factura_seguimientos WHERE factura_id=$id ORDER BY creado_en DESC");
$totalPagado=(float)$conn->query("SELECT COALESCE(SUM(importe),0) total FROM factura_pagos WHERE factura_id=$id")->fetch_assoc()['total'];$saldo=(float)$factura['importe']-$totalPagado;?>
<?php if(isset($_GET['guardada'])):?><div class="alert alert-success">Factura guardada correctamente.</div><?php endif;?>
<?php if(isset($_GET['pago'])):?><div class="alert alert-success">Pago registrado correctamente.</div><?php endif;?>
<?php if(isset($_GET['error_pago'])):?><div class="alert alert-danger">El importe debe ser mayor a cero y no puede superar el saldo pendiente.</div><?php endif;?>
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2"><div><a href="?">← Volver</a><h3 class="page-title my-2">Factura <?=e($factura['nro_factura']?:'sin número')?></h3></div><div class="d-flex gap-2"><a class="btn btn-outline-primary" href="?accion=editar&id=<?=$id?>">Editar factura</a><form method="post" onsubmit="return confirm('¿Eliminar esta factura y todo su historial?');"><input type="hidden" name="tipo" value="eliminar"><input type="hidden" name="factura_id" value="<?=$id?>"><button class="btn btn-outline-danger">Eliminar factura</button></form></div></div>
<div class="card mb-3"><div class="card-body"><div><b>Cliente:</b> <?php $cn=$conn->query("SELECT nombre FROM clientes WHERE id=".(int)$factura['cliente_id'])->fetch_assoc();echo e($cn['nombre']??'');?></div><div><b>Fecha de emisión:</b> <?=e($factura['fecha_factura']?:'—')?> · <b>Condición:</b> <?=e($factura['condicion']==='Credito'?'Crédito':($factura['condicion']?:'—'))?></div></div></div>
<div class="card card-hm mb-3"><div class="card-body table-responsive"><table class="table"><thead><tr><th class="text-end">Cantidad</th><th>Descripción</th><th class="text-end">Precio unitario</th><th class="text-end">Exentas</th><th class="text-end">IVA 5%</th><th class="text-end">IVA 10%</th></tr></thead><tbody><?php foreach($detalles as $d):?><tr><td class="text-end"><?=numero_py($d['cantidad'])?></td><td><?=e($d['descripcion'])?></td><td class="text-end"><?=numero_py($d['precio_unitario'])?></td><td class="text-end"><?=numero_py($d['exentas'])?></td><td class="text-end"><?=numero_py($d['iva5'])?></td><td class="text-end"><?=numero_py($d['iva10'])?></td></tr><?php endforeach;?></tbody><tfoot><tr><th colspan="3" class="text-end">Subtotales</th><th class="text-end"><?=numero_py($factura['total_exentas'])?></th><th class="text-end"><?=numero_py($factura['total_iva5'])?></th><th class="text-end"><?=numero_py($factura['total_iva10'])?></th></tr></tfoot></table><div class="text-end"><b>Total IVA 5%:</b> <?=numero_py($factura['total_iva_5'])?> · <b>Total IVA 10%:</b> <?=numero_py($factura['total_iva_10'])?><br><span class="fs-5"><b>Total factura:</b> <?=numero_py($factura['importe'])?></span></div></div></div>
<div class="row g-3"><div class="col-lg-6"><div class="card card-hm"><div class="card-body"><h5>Pago de la factura</h5>
<?php if($saldo>0):?><form method="post"><input type="hidden" name="tipo" value="pago"><input type="hidden" name="factura_id" value="<?=$id?>"><label>Fecha del pago</label><input class="form-control mb-2" type="date" name="fecha_pago" required><label>Importe del pago</label><input class="form-control mb-2 text-end numero-miles" name="importe" value="<?=numero_py($saldo)?>" required><small class="text-muted d-block mb-2">Saldo pendiente: <?=numero_py($saldo)?></small><label>Observación</label><textarea class="form-control mb-2" name="observacion"></textarea><button class="btn btn-hm">Registrar pago</button></form><?php else:?><div class="alert alert-success">Factura pagada. Saldo pendiente: 0.</div><?php endif;?>
<hr><h5>Histórico de pagos</h5><div class="table-responsive"><table class="table"><thead><tr><th>Fecha</th><th>Observación</th><th class="text-end">Importe</th></tr></thead><tbody><?php if(!$pagos->num_rows):?><tr><td colspan="3" class="text-muted">Sin pagos registrados.</td></tr><?php else:while($p=$pagos->fetch_assoc()):?><tr><td><?=e($p['fecha_pago'])?></td><td><?=e($p['observacion'])?></td><td class="text-end"><?=numero_py($p['importe'])?></td></tr><?php endwhile;endif;?></tbody></table></div></div></div></div>
<div class="col-lg-6"><div class="card card-hm"><div class="card-body"><h5>Seguimiento</h5><?php while($s=$seguimientos->fetch_assoc()):?><p><small><?=e($s['creado_en'])?></small><br><?=nl2br(e($s['detalle']))?></p><?php endwhile;?><?php if($saldo>0):?><form method="post"><input type="hidden" name="tipo" value="seguimiento"><input type="hidden" name="factura_id" value="<?=$id?>"><textarea class="form-control mb-2" name="detalle" required></textarea><button class="btn btn-hm">Agregar seguimiento</button></form><?php else:?><div class="alert alert-secondary">La factura está pagada y ya no admite nuevos seguimientos.</div><?php endif;?></div></div></div></div>

<?php else:?>
<a href="?">← Volver</a><h3 class="page-title my-3"><?=$id?'Editar':'Nueva'?> factura</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" id="formFactura"><input type="hidden" name="id" value="<?=$id?>"><div class="row g-3 mb-3">
<div class="col-md-3"><label>Número de factura</label><input class="form-control" name="nro_factura" value="<?=e($factura['nro_factura'])?>"></div>
<div class="col-md-3"><label>Fecha de emisión</label><input class="form-control" type="date" name="fecha_factura" value="<?=e($factura['fecha_factura'])?>"></div>
<div class="col-md-3"><label>Condición</label><select class="form-select" name="condicion"><option value="">Seleccione</option><option value="Contado" <?=$factura['condicion']==='Contado'?'selected':''?>>Contado</option><option value="Credito" <?=$factura['condicion']==='Credito'?'selected':''?>>Crédito</option></select></div>
<div class="col-md-3"><label>Cliente *</label><select class="form-select" name="cliente_id" required><option value="">Seleccione</option><?php while($c=$clientes->fetch_assoc()):?><option value="<?=$c['id']?>" <?=$factura['cliente_id']==$c['id']?'selected':''?>><?=e($c['nombre'])?></option><?php endwhile;?></select></div></div>
<div class="table-responsive"><table class="table table-bordered align-middle"><thead><tr><th class="text-end">Cantidad</th><th>Descripción</th><th class="text-end">Precio unitario</th><th class="text-end">Exentas</th><th class="text-end">IVA 5%</th><th class="text-end">IVA 10%</th></tr></thead><tbody>
<?php for($i=1;$i<=8;$i++):$d=$detalles[$i]??[];$req=$i===1?'required':'';?><tr><td><input class="form-control text-end numero-miles calc" name="cantidad[]" value="<?=isset($d['cantidad'])?numero_py($d['cantidad']):''?>" <?=$req?>></td><td><input class="form-control" name="descripcion[]" value="<?=e($d['descripcion']??'')?>" <?=$req?>></td><td><input class="form-control text-end numero-miles calc" name="precio_unitario[]" value="<?=isset($d['precio_unitario'])?numero_py($d['precio_unitario']):''?>" <?=$req?>></td><td><input class="form-control text-end numero-miles calc exentas" name="exentas[]" value="<?=isset($d['exentas'])?numero_py($d['exentas']):''?>"></td><td><input class="form-control text-end numero-miles calc iva5" name="iva5[]" value="<?=isset($d['iva5'])?numero_py($d['iva5']):''?>"></td><td><input class="form-control text-end numero-miles calc iva10" name="iva10[]" value="<?=isset($d['iva10'])?numero_py($d['iva10']):''?>"></td></tr><?php endfor;?>
</tbody><tfoot><tr><th colspan="3" class="text-end">Subtotales</th><th id="subEx" class="text-end">0</th><th id="sub5" class="text-end">0</th><th id="sub10" class="text-end">0</th></tr></tfoot></table></div>
<div class="row justify-content-end"><div class="col-md-5"><table class="table"><tr><th>Total IVA 5%</th><td id="total5" class="text-end">0</td></tr><tr><th>Total IVA 10%</th><td id="total10" class="text-end">0</td></tr><tr class="fs-5"><th>Total factura</th><td id="totalFactura" class="text-end fw-bold">0</td></tr></table></div></div>
<label>Observación</label><textarea class="form-control" name="observacion"><?=e($factura['observacion'])?></textarea><button class="btn btn-hm mt-3">Guardar factura</button></form></div></div>
<script>
const n=v=>parseInt((v||'').replace(/\D/g,''))||0,fmt=v=>new Intl.NumberFormat('es-PY',{maximumFractionDigits:0}).format(v);
function calcular(){let ex=0,i5=0,i10=0;document.querySelectorAll('.exentas').forEach(x=>ex+=n(x.value));document.querySelectorAll('.iva5').forEach(x=>i5+=n(x.value));document.querySelectorAll('.iva10').forEach(x=>i10+=n(x.value));subEx.textContent=fmt(ex);sub5.textContent=fmt(i5);sub10.textContent=fmt(i10);total5.textContent=fmt(Math.round(i5/21));total10.textContent=fmt(Math.round(i10/11));totalFactura.textContent=fmt(ex+i5+i10)}
document.querySelectorAll('.calc').forEach(x=>x.addEventListener('input',calcular));calcular();
</script>
<?php endif;?></div></main><?php include __DIR__.'/../../includes/footer.php';?>
