<?php
//Incluimos conexion a la base de 
date_default_timezone_set('America/Lima');
require_once('../config/Conexion.php');

Class Contrato
{
  //Implementando nuestro constructor
  public function __construct()
  {

  }
    
      public function insertar($idusuario, $idpersona, $fecha_hora, $descripcion, $tipo_contrato, $tipo_ingreso, $total_venta, $intereses_total, $estado_vendedor,$idempleado, $iddetalle_pabellon, $precio_venta, $precio_adicional, $nro_comprobante, $descripcion_pago, $monto_pago, $metodo_pago, $fecha_pago) {
            global $conexion;

            try {
                mysqli_begin_transaction($conexion);

                $saber = "SELECT MAX(idcontrato) as ultimo_id FROM contrato";
                $saberExiste = ejecutarConsultaSimpleFila($saber);

                $fecha_año = date("Y");
                $fecha_mes = date("m");
                $variable = $fecha_mes . $fecha_año;

                $ultimo_id = $saberExiste ? (int)$saberExiste['ultimo_id'] : 0;
                $nuevo_id = $ultimo_id + 1;
                $nro_contrato = $variable . '-' . str_pad($nuevo_id, 5, '0', STR_PAD_LEFT);

                // // Validaciones
                // $descripcion_fallecimiento = !empty($descripcion_fallecimiento) ? $descripcion_fallecimiento : 'S/D';
                // $idfuneraria = !empty($idfuneraria) ? $idfuneraria : 0;
                // $fecha_fallecimiento = !empty($fecha_fallecimiento) ? "'$fecha_fallecimiento'" : "NULL";
                // $fecha_entierro = !empty($fecha_entierro) ? "'$fecha_entierro'" : "NULL";

                // if ($iddifunto > 0) {
                //     $sql_update = "UPDATE difunto SET descripcion_fallecimiento='$descripcion_fallecimiento', fecha_fallecimiento=$fecha_fallecimiento, fecha_entierro=$fecha_entierro WHERE iddifunto='$iddifunto'";
                //     ejecutarConsulta($sql_update);
                // }

                // Estado del contrato
                $estado_contrato = ($tipo_contrato == 1) ? '2' : (($tipo_contrato == 2 || $tipo_contrato == 3) ? '1' : '0');

                $sql = "INSERT INTO contrato(idcliente, idusuario, serie, correlativo, fecha_hora, total_contrato, total_intereses,nrocontrato, tipo_contrato, tipo_ingreso, estado_contrato, descripcion, estado_vendedor, idempleado) 
                        VALUES ('$idpersona','$idusuario','$variable','$nuevo_id','$fecha_hora','$total_venta', '$intereses_total','$nro_contrato','$tipo_contrato','$tipo_ingreso','$estado_contrato', '$descripcion', '$estado_vendedor' ,'$idempleado' )";
                $idcontrato = ejecutarConsulta_retornarID($sql);

                for ($i = 0; $i < count($iddetalle_pabellon); $i++) {
                    // Determinar estado_nicho según tipo_contrato y si hay difunto
                    if ($tipo_contrato == 1) { // Contado
                        $estado_nicho =  '2';
                    } elseif ($tipo_contrato == 2) { // Crédito
                        $estado_nicho =  '3';
                    } elseif ($tipo_contrato == 3) { // Futuro
                        $estado_nicho = '4'; // Siempre 3
                    }elseif ($tipo_contrato == 4) { // Futuro
                        $estado_nicho = '2'; // Contado
                    } else {
                        throw new Exception("Tipo de contrato no válido");
                    }

                    $sql_detalle_pabellon = "UPDATE detalle_pabellon 
                        SET precio_venta='{$precio_venta[$i]}',
                            precio_adicional='{$precio_adicional[$i]}', 
                            estado_nicho='$estado_nicho', 
                            idcontrato='$idcontrato'
                        WHERE iddetalle_pabellon='{$iddetalle_pabellon[$i]}' and (estado_nicho = '1' OR estado_nicho = '6')";

                    if (!ejecutarConsulta($sql_detalle_pabellon)) {
                        throw new Exception("Error al actualizar nicho #$i");
                    }
                }

                // Registrar pagos SOLO si contrato es contado
                if ($tipo_contrato == 1 || $tipo_contrato == 4) {
                    for ($j = 0; $j < count($nro_comprobante); $j++) {
                        $sql_pago = "INSERT INTO ingreso (idcontrato, idusuario, descripcion, monto, nrorecibo ,metodo_pago, fecha)
                                    VALUES ('$idcontrato', '$idusuario','{$descripcion_pago[$j]}', '{$monto_pago[$j]}', '{$nro_comprobante[$j]}', '{$metodo_pago[$j]}', '{$fecha_pago[$j]}')";
                        if (!ejecutarConsulta($sql_pago)) {
                            throw new Exception("Error al insertar pago #$j");
                        }
                    }
                }

                mysqli_commit($conexion);
                return true;

            } catch (Exception $e) {
                mysqli_rollback($conexion);
                echo "❌ Error: " . $e->getMessage();
                return false;
            }
        }

    // Método para editar
    public function editar($idcontrato,$idusuario, $idpersona, $fecha_hora, $descripcion, $tipo_contrato, $tipo_ingreso, $total_venta, $intereses_total, $estado_contrato, $estado_vendedor, $idempleado, $iddetalle_pabellon, $precio_venta, $precio_adicional, $nro_comprobante, $descripcion_pago, $monto_pago, $metodo_pago, $fecha_pago) {
        
          global $conexion;
            try {
                mysqli_begin_transaction($conexion);

                  if (!isset($estado_contrato) || $estado_contrato != '2') {
                      $estado_contrato = ($tipo_contrato == 1 || $tipo_contrato == 4) ? '2' : (($tipo_contrato == 2 || $tipo_contrato == 3) ? '1' : '0');
                  }

                    $sql = "UPDATE contrato SET 
                            idcliente = '$idpersona', 
                            idusuario = '$idusuario',
                            fecha_hora='$fecha_hora',
                            total_intereses='$intereses_total',
                            total_contrato='$total_venta',
                            descripcion='$descripcion',
                            tipo_contrato='$tipo_contrato',
                            tipo_ingreso='$tipo_ingreso',
                            estado_contrato='$estado_contrato', 
                            estado_vendedor='$estado_vendedor',
                            idempleado='$idempleado'  
                            WHERE idcontrato = '$idcontrato'";
                   ejecutarConsulta($sql);

                   // 1. Obtener los detalle_pabellon anteriores del contrato actual
                    $detalles_actuales = ejecutarConsultaSimpleFila("SELECT GROUP_CONCAT(iddetalle_pabellon) AS detalles FROM detalle_pabellon WHERE idcontrato = '$idcontrato'");
                    $detalles_guardados = explode(',', $detalles_actuales['detalles'] ?? []);

                    // 2. Preparar array de los nuevos detalle_pabellon enviados
                    $detalles_nuevos = $iddetalle_pabellon; // Viene del formulario (array)

                    // 3. Detectar los que deben ser reseteados (estaban antes pero ya no están ahora)
                    $detalles_a_liberar = array_diff($detalles_guardados, $detalles_nuevos);

                    // 4. Liberar nichos antiguos que ya no están en la edición
                    foreach ($detalles_a_liberar as $iddetalle) {
                        $sql_liberar = "UPDATE detalle_pabellon SET 
                            estado_nicho = '1',
                            idcontrato = '0',
                            precio_adicional = '0',
                            precio_venta = '0',
                            iddifunto = '0',
                            idpersona = '0',
                            idfuneraria = '0'
                            WHERE iddetalle_pabellon = '$iddetalle'";

                        if (!ejecutarConsulta($sql_liberar)) {
                            throw new Exception("Error al liberar nicho $iddetalle");
                        }
                    }
                    // 5. Actualizar los nichos seleccionados actualmente
                    for ($i = 0; $i < count($iddetalle_pabellon); $i++) {
                        $iddetalleActual = $iddetalle_pabellon[$i];

                        // Determinar estado_nicho
                        if ($tipo_contrato == 1) {
                            $estado_nicho = '2';
                        } elseif ($tipo_contrato == 2) {
                            $estado_nicho = '3';
                        } elseif ($tipo_contrato == 3) {
                            $estado_nicho = '4';
                        } elseif ($tipo_contrato == 4) {
                            $estado_nicho = '2';
                        } else {
                            throw new Exception("Tipo de contrato no válido");
                        }

                        $sql_actualizar = "UPDATE detalle_pabellon SET 
                            precio_venta = '{$precio_venta[$i]}',
                            precio_adicional = '{$precio_adicional[$i]}',
                            estado_nicho = '$estado_nicho',
                            idcontrato = '$idcontrato'
                            WHERE iddetalle_pabellon = '$iddetalleActual'";

                        if (!ejecutarConsulta($sql_actualizar)) {
                            throw new Exception("Error al actualizar nicho $i");
                        }
                    }

                  if ($tipo_contrato == 1 || $tipo_contrato == 4) {
                     $sql_eliminar="DELETE FROM ingreso WHERE idcontrato='$idcontrato'";
                     ejecutarConsulta($sql_eliminar);
                    for ($j = 0; $j < count($nro_comprobante); $j++) {
                        $sql_pago = "INSERT INTO ingreso (idcontrato, idusuario, descripcion, monto, nrorecibo ,metodo_pago, fecha)
                                    VALUES ('$idcontrato', '$idusuario','{$descripcion_pago[$j]}', '{$monto_pago[$j]}', '{$nro_comprobante[$j]}', '{$metodo_pago[$j]}', '{$fecha_pago[$j]}')";
                        if (!ejecutarConsulta($sql_pago)) {
                            throw new Exception("Error al insertar pago #$j");
                        }
                    }
                  }else{
                      $sql_acuenta = "SELECT sum(monto) as monto_pagado FROM ingreso WHERE idcontrato = '$idcontrato'";
                        $resultado = ejecutarConsultaSimpleFila($sql_acuenta);
                        $monto_pagado = $resultado['monto_pagado'];

                        if($monto_pagado == $total_venta ){
                        
                          $update_venta="UPDATE contrato SET estado_contrato='2' WHERE idcontrato='$idcontrato'";
                           ejecutarConsulta($update_venta);
                        }else{
                          $update_venta="UPDATE contrato SET estado_contrato='1' WHERE idcontrato='$idcontrato'";
                           ejecutarConsulta($update_venta);
                        }
                  }

                  


                mysqli_commit($conexion);
                return true;

            } catch (Exception $e) {
                mysqli_rollback($conexion);
                echo "❌ Error: " . $e->getMessage();
                return false;
            }
    }

    public function listarcontrato()
    {
      $sql="SELECT c.idcontrato,c.fecha_hora,c.total_contrato,c.nrocontrato,c.tipo_contrato,c.tipo_ingreso,c.estado_contrato,p.nombre as nombre_cliente,u.nombre as responsable,o.nombre as nombre_vendedor
            FROM contrato c
            JOIN persona p ON c.idcliente=p.idpersona
            LEFT JOIN persona o ON c.idempleado=o.idpersona
            JOIN usuario u ON c.idusuario=u.idusuario";
      return ejecutarConsulta($sql);
    }

     public function listar_venta()
    {
     $anioActual = date("Y");
      $sql="SELECT p.nombre as nombre_vendedor,count(d.idcontrato)as cantidad FROM contrato c 
           JOIN detalle_pabellon d ON c.idcontrato=d.idcontrato
           JOIN persona p ON c.idempleado=p.idpersona WHERE year(c.fecha_hora) ='$anioActual'";
      return ejecutarConsulta($sql);
    }

     public function mostrar($idcontrato)
    {
      $sql="SELECT * FROM contrato where idcontrato='$idcontrato'";
      return ejecutarConsultaSimpleFila($sql);
    }

    public function selectContrato()
    {
      $sql="SELECT c.idcontrato,c.nrocontrato,p.nombre as nombre_persona 
            FROM contrato c
            JOIN persona p ON c.idcliente=p.idpersona";
      return ejecutarConsulta($sql);
    }

    public function listar_stock()
    {
      $sql="SELECT d.iddetalle_pabellon,d.fila,d.columna,d.abc,p.nombre as nombre_pabellon,o.monto as precio_venta,f.nombre as nombre_difunto FROM detalle_pabellon d 
            JOIN pabellon p ON d.idpabellon=p.idpabellon 
            LEFT JOIN difunto f ON d.iddifunto=f.iddifunto
            JOIN precio_nicho o ON d.fila=o.idprecio  WHERE d.estado_nicho='1'";
      return ejecutarConsulta($sql);
    }

     public function mostrar_acuenta($idcontrato)
    {
            $queryVentas="SELECT * 
            FROM contrato
            WHERE idcontrato='$idcontrato'";
            $resultVentas = ejecutarConsulta($queryVentas);
            $contratos = [];
            while ($row = $resultVentas->fetch_assoc()) {
            $contratos[] = $row;
            }
            $queryDetalles="SELECT * FROM ingreso WHERE idcontrato='$idcontrato' ";
            $resulDetalles= ejecutarConsulta($queryDetalles);
            $detalles = [];
            $totalMonto = 0;
            while ($row = $resulDetalles->fetch_assoc()) {
            $detalles[] = $row;
            $totalMonto += $row['monto'];
            }
            // Agregar totalMonto al array de ventas
            if (!empty($contratos)) {
              $contratos[0]['totalMonto'] = $totalMonto;
            }
            // Respuesta JSON
            return [
            "contratos" => $contratos,
            "detalles" => $detalles
            ];
    }

    public function guardar_pago($idcontrato,$idusuario,$nrorecibo_acuenta,$descripcion_acuenta,$monto_acuenta,$metodo_acuenta,$fecha_acuenta,$total_venta)
    {

      $sql_ingreso="INSERT INTO ingreso (idcontrato,idusuario,descripcion,monto,nrorecibo,fecha,metodo_pago) 
                   VALUES('$idcontrato','$idusuario','$descripcion_acuenta','$monto_acuenta','$nrorecibo_acuenta','$fecha_acuenta','$metodo_acuenta')";
      ejecutarConsulta($sql_ingreso);

      $sql_acuenta = "SELECT sum(monto) as monto_pagado FROM ingreso WHERE idcontrato = '$idcontrato'";
      $resultado = ejecutarConsultaSimpleFila($sql_acuenta);
      $monto_pagado = $resultado['monto_pagado'];

      if($monto_pagado == $total_venta ){
       
        $update_venta="UPDATE contrato SET estado_contrato='2',tipo_contrato='1',tipo_ingreso='1' WHERE idcontrato='$idcontrato'";
        return ejecutarConsulta($update_venta);
      }else{
        $update_venta="UPDATE contrato SET estado_contrato='1' WHERE idcontrato='$idcontrato'";
        return ejecutarConsulta($update_venta);
      }
      
    }

     public function eliminarDetalle($idingreso)
    {
      $sql_eliminar="DELETE FROM ingreso WHERE idingreso='$idingreso'";
      return ejecutarConsulta($sql_eliminar);

    }

     public function mostrar_contrato($idcontrato)
    {
            $queryVentas="SELECT * FROM contrato WHERE idcontrato='$idcontrato'";
            $resultVentas = ejecutarConsulta($queryVentas);

            $contratos = [];
            while ($row = $resultVentas->fetch_assoc()) {
            $contratos[] = $row;
            }

            $queryDetalles=" SELECT d.iddetalle_pabellon,d.fila,d.columna,d.precio_venta,d.precio_adicional,d.estado_nicho,d.iddifunto,p.nombre as nombre_pabellon,o.nombre as nombre_difunto 
                              FROM detalle_pabellon d 
                              JOIN pabellon p ON d.idpabellon=p.idpabellon
                              LEFT JOIN difunto o ON d.iddifunto=o.iddifunto
                              WHERE d.idcontrato='$idcontrato' ";
            $resulDetalles= ejecutarConsulta($queryDetalles);

            $detalles = [];
            while ($row = $resulDetalles->fetch_assoc()) {
            $detalles[] = $row;
            }

            $queryDetallePagos=" SELECT * FROM ingreso WHERE idcontrato='$idcontrato' ";
            $resulDetallePagos= ejecutarConsulta($queryDetallePagos);

            $detallepagos = [];
            while ($row = $resulDetallePagos->fetch_assoc()) {
            $detallepagos[] = $row;
            }
            // Respuesta JSON
            return [
            "contratos" => $contratos,
            "detalles" => $detalles,
            "detallepagos" => $detallepagos
            ];
    }

      public function mostrar_difunto($detalle_pabellonid)
    {
            $queryVentas="SELECT d.iddetalle_pabellon,d.idfuneraria,f.iddifunto,f.descripcion_fallecimiento,f.fecha_fallecimiento,f.fecha_entierro 
                          FROM detalle_pabellon d 
                          LEFT JOIN difunto f ON d.iddifunto=f.iddifunto 
                          WHERE d.iddetalle_pabellon='$detalle_pabellonid'";
            $resultVentas = ejecutarConsulta($queryVentas);

            $pabellon_detalle = [];
            while ($row = $resultVentas->fetch_assoc()) {
            $pabellon_detalle[] = $row;
            }

            // Respuesta JSON
            return [
            "pabellon_detalle" => $pabellon_detalle
            ];
    }

    public function guardarDetalle($iddetalle_difunto,$iddifunto,$descripcion_fallecimiento,$idfuneraria,$fecha_fallecimiento,$fecha_entierro)
    {
      $sql_actualizar1="UPDATE difunto SET descripcion_fallecimiento='$descripcion_fallecimiento',fecha_fallecimiento='$fecha_fallecimiento',
                      fecha_entierro='$fecha_entierro' WHERE iddifunto='$iddifunto'";
      ejecutarConsulta($sql_actualizar1);

      $sql_actualizar="UPDATE detalle_pabellon SET iddifunto='$iddifunto',idfuneraria='$idfuneraria',estado_nicho='6' WHERE iddetalle_pabellon='$iddetalle_difunto'";
      return ejecutarConsulta($sql_actualizar);
    }


    public function grafico_contrato()
{
    $query = "SELECT 
                CASE 
                    WHEN tipo_contrato = 1 THEN 'Contado'
                    WHEN tipo_contrato = 2 THEN 'Crédito'
                    WHEN tipo_contrato = 3 THEN 'Futuro'
                    WHEN tipo_contrato = 4 THEN 'Donacion'
                    ELSE 'Otro'
                END AS name,
                COUNT(*) AS y
              FROM contrato
              GROUP BY tipo_contrato";

    $result = ejecutarConsulta($query);

    $data = [];
    while ($row = $result->fetch_assoc()) {
        $data[] = [
            "name" => $row["name"],
            "y" => (int)$row["y"]
        ];
    }

    return ["data" => $data];
}

  public function eliminar($idcontrato){

    $update_detalle="UPDATE detalle_pabellon SET precio_adicional='0',estado_nicho='1',idcontrato='0',idpersona='0',iddifunto='0',idfuneraria='0',precio_venta='0'  WHERE idcontrato='$idcontrato'";
    ejecutarConsulta($update_detalle);

    $sqlingreso="DELETE FROM ingreso WHERE idcontrato='$idcontrato'";
    ejecutarConsulta($sqlingreso);
    
    $sql="DELETE FROM contrato WHERE idcontrato='$idcontrato'";
    return ejecutarConsulta($sql);

  }



}