<?php
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}
include 'config/connexion.php';
include 'includes/simple_log.php';
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
$info = null;
$policyHasNextPaiement = false; // détecter présence colonne
if ($id > 0) {
    // Récupérer les infos de la police depuis policy_table
    $sql = "SELECT id, n_policy, n_attestation, client_id, immatriculation, end_date, montant_to_paie, montant_paye, total_reste FROM policy_table WHERE id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $stmt->bind_result($policy_id, $n_policy, $n_attestation, $client_id, $immatriculation, $end_date, $montant_to_paie, $montant_paye, $total_reste);
    if ($stmt->fetch()) {
        $info = [
            'id' => $policy_id,
            'n_policy' => $n_policy,
            'n_attestation' => $n_attestation,
            'client_id' => $client_id,
            'client_name' => '',
            'immatriculation' => $immatriculation,
            'end_date' => $end_date,
            'montant_to_paie' => $montant_to_paie,
            'montant_paye' => $montant_paye,
            'reste' => $total_reste,
            'next_paiement' => null,
        ];
    }
    $stmt->close();
    
    // Récupérer les informations du client depuis clients_table
    if ($info && $client_id) {
        $sql_client = "SELECT client_name, client_cin, client_phone, client_adresse FROM clients_table WHERE id = ?";
        $stmt_client = $conn->prepare($sql_client);
        $stmt_client->bind_param("i", $client_id);
        $stmt_client->execute();
        $stmt_client->bind_result($client_name_db, $client_cin, $client_tel, $client_adresse);
        if ($stmt_client->fetch()) {
            // Mettre à jour les infos du client avec celles de la base de données
            $info['client_name'] = $client_name_db;
            $info['client_cin'] = $client_cin;
            $info['client_tel'] = $client_tel;
            $info['client_adresse'] = $client_adresse;
        }
        $stmt_client->close();
    }
    
    // Get next_paiement separately if column exists
    if ($info && $policyHasNextPaiement) {
        $sql2 = "SELECT next_paiement FROM policy_table WHERE id = ?";
        $stmt2 = $conn->prepare($sql2);
        $stmt2->bind_param("i", $id);
        $stmt2->execute();
        $stmt2->bind_result($next_paiement);
        if ($stmt2->fetch()) {
            $info['next_paiement'] = $next_paiement;
        }
        $stmt2->close();
    }
}

// Vérifier si la colonne next_paiement existe (une seule fois)
try {
  $chkCol = $conn->query("SHOW COLUMNS FROM policy_table LIKE 'next_paiement'");
  if($chkCol && $chkCol->num_rows>0){ $policyHasNextPaiement = true; }
  if($chkCol) $chkCol->close();
} catch(Throwable $e){ /* ignorer */ }

// Récupérer les modes de paiement depuis paiement_mode_table
$paiement_modes = [];
$queryModes = "SELECT paiement_mode FROM paiement_mode_table";
$resultModes = $conn->query($queryModes);
if ($resultModes && $resultModes->num_rows > 0) {
    while ($row = $resultModes->fetch_assoc()) {
        $paiement_modes[] = $row['paiement_mode'];
    }
}

// Traitement du paiement
$success = false;
$error = '';
// Traitement du paiement
$success = false;
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $info) {
    $montant = floatval(str_replace(',', '.', $_POST['montant']));
    $paiement_mode = strtoupper(trim($_POST['paiement_mode'] ?? ''));
    $paiement_ref = trim($_POST['paiement_ref'] ?? '');
    $echeance_date = isset($_POST['echeance_date']) ? trim($_POST['echeance_date']) : null;
  $next_paiement_date = isset($_POST['next_paiement_date']) ? trim($_POST['next_paiement_date']) : '';

    // Validate payment mode
    if (empty($paiement_mode)) {
        $error = "Le mode de paiement est obligatoire.";
    }

    // Validate reference number for CHEQUE and EFFET
    if (in_array($paiement_mode, ['CHEQUE', 'EFFET']) && empty($paiement_ref)) {
        $error = "Le numéro de référence est obligatoire pour ce mode de paiement.";
    }

    // Validate due date for CHEQUE and EFFET
    if (in_array($paiement_mode, ['CHEQUE', 'EFFET']) && empty($echeance_date)) {
        $error = "La date d'échéance est obligatoire pour ce mode de paiement.";
    }

    // Validate payment amount
    if (!$error && ($montant <= 0 || $montant > floatval($info['reste']))) {
        $error = "Montant invalide.";
    }

  if (!$error) {
        // Déterminer le statut du paiement
        $paiement_statut = 0;
        if (!in_array(strtoupper($paiement_mode), ['CHEQUE', 'EFFET', 'VIREMENT BANCAIRE'])) {
            $paiement_statut = 1;
        }

        // Générer un numéro de reçu unique
        do {
            $receipt_number = 'R-' . date('Ymd') . '-' . sprintf('%04d', mt_rand(1, 9999));
            $checkReceipt = $conn->prepare("SELECT id FROM receipts_table WHERE receipt_number = ?");
            $checkReceipt->bind_param("s", $receipt_number);
            $checkReceipt->execute();
            $checkReceipt->store_result();
            $exists = $checkReceipt->num_rows > 0;
            $checkReceipt->close();
        } while ($exists);        // Insérer le reçu dans receipts_table (sans start_date et end_date)
        
        // Calculer le nouveau reste AVANT l'insertion du reçu
        $nouveau_montant_paye = $info['montant_paye'] + $montant;
        $nouveau_total_reste = $info['montant_to_paie'] - $nouveau_montant_paye;
        
        $insertReceipt = $conn->prepare("INSERT INTO receipts_table (
            receipt_number, policy_number, client_id, immatriculation, montant_total, montant_paye, reste_a_payer, agent, date_creation, paiement_mode, paiement_ref, echeance_date, paiement_statut, n_attestation
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
        $now = date('Y-m-d H:i:s');
        $agent = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : 0;
        
        // Si le paiement est en espèce ou virement bancaire, la date d'échéance est le même jour
        if (in_array(strtoupper($paiement_mode), ['ESPECE', 'VIREMENT BANCAIRE'])) {
            $echeance_date_param = date('Y-m-d'); // Date du jour
        } else {
            $echeance_date_param = ($echeance_date && in_array(strtoupper($paiement_mode), ['CHEQUE', 'EFFET'])) ? $echeance_date : null;
        }
        $insertReceipt->bind_param(
            "ssisdddissssis",
            $receipt_number,
            $info['n_policy'],
            $info['client_id'],
            $info['immatriculation'],
            $info['montant_to_paie'],
            $montant,
            $nouveau_total_reste,
            $agent,
            $now,
            $paiement_mode,
            $paiement_ref,
            $echeance_date_param,
            $paiement_statut,
            $info['n_attestation']
        );
        $insertReceipt->execute();
        $receipt_id = $conn->insert_id;
        $insertReceipt->close();

        // Si reste après paiement, exiger une date de prochain paiement
        if($nouveau_total_reste > 0){
          if($next_paiement_date === ''){
            $error = "Veuillez fixer une date du prochain paiement (reste dû).";
          } elseif(!preg_match('/^\\d{4}-\\d{2}-\\d{2}$/',$next_paiement_date)) {
            $error = "Format de date prochain paiement invalide (AAAA-MM-JJ).";
          }
        } else { // plus de reste -> ignorer/date vide
          $next_paiement_date = '';
        }

        // Tenter d'ajouter la colonne si absente et besoin
        if(!$error && !$policyHasNextPaiement){
          try { $conn->query("ALTER TABLE policy_table ADD COLUMN next_paiement DATE NULL"); $policyHasNextPaiement=true; } catch(Throwable $e){ /* silencieux */ }
        }

        if(!$error){
          // Mettre à jour policy_table uniquement si le mode de paiement est ESPECE
          if(strtoupper($paiement_mode) === 'ESPECE'){
            if($policyHasNextPaiement){
              $updatePolicy = $conn->prepare("UPDATE policy_table SET montant_paye = ?, total_reste = ?, next_paiement = ? WHERE n_policy = ?");
              $np = ($next_paiement_date!=='') ? $next_paiement_date : NULL;
              $updatePolicy->bind_param("ddss", $nouveau_montant_paye, $nouveau_total_reste, $np, $info['n_policy']);
            } else {
              $updatePolicy = $conn->prepare("UPDATE policy_table SET montant_paye = ?, total_reste = ? WHERE n_policy = ?");
              $updatePolicy->bind_param("dds", $nouveau_montant_paye, $nouveau_total_reste, $info['n_policy']);
            }
            $updatePolicy->execute();
            $updatePolicy->close();
          }
        }

        if($error){
          // si erreur à ce stade (date manquante) supprimer le reçu inséré pour cohérence
          if(isset($receipt_id)){
            try { $del=$conn->prepare("DELETE FROM receipts_table WHERE id=? LIMIT 1"); $del->bind_param("i", $receipt_id); $del->execute(); $del->close(); } catch(Throwable $ie){}
          }
        } else {
          // Enregistrer le paiement dans le log global
        logPayment($info['n_policy'], $montant, $paiement_mode, $paiement_ref, $receipt_number);

        // Rediriger directement vers la page d'impression du reçu
        header('Location: print_receipt.php?id=' . $receipt_id);
        exit;
        }
    }
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
  <?php include ('includes/head.php'); ?>
</head>
<body id="page-top">
  <div id="wrapper">
    <?php include ('includes/sidebar.php'); ?>
    <div id="content-wrapper" class="d-flex flex-column">
      <div id="content">
        <?php include ('includes/topbar.php'); ?>
        <div class="container-fluid" id="container-wrapper">
          <div class="d-sm-flex align-items-center justify-content-between mb-4">
            <h1 class="h3 mb-0 text-gray-800">Paiement de la Police</h1>
            <ol class="breadcrumb">
              <li class="breadcrumb-item"><a href="./">Accueil</a></li>
              <li class="breadcrumb-item"><a href="policys_table.php">Polices</a></li>
              <li class="breadcrumb-item active" aria-current="page">Paiement</li>
            </ol>
          </div>
          <div class="row">
            <div class="col-lg-6">
              <div class="card mb-4">
                <div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
                  <h6 class="m-0 font-weight-bold text-primary">Détails du paiement</h6>
                </div>
                <div class="card-body">
                  <?php if ($info): ?>
                    <ul class="list-group">
                      <li class="list-group-item"><strong>ID Police:</strong> <?php echo $info['id']; ?></li>
                      <li class="list-group-item"><strong>ID Client:</strong> <?php echo htmlspecialchars($info['client_id']); ?></li>
                      <li class="list-group-item"><strong>Nom Client:</strong> <?php echo htmlspecialchars($info['client_name']); ?></li>
                      <li class="list-group-item"><strong>Immatriculation:</strong>
                        <?php
                        $immat = trim($info['immatriculation']);
                        $immat_parts = preg_split('/\s*-\s*/u', $immat);
                        if(count($immat_parts) === 3) {
                          $part1 = trim($immat_parts[0]);
                          $part2 = trim($immat_parts[1]);
                          $part3 = trim($immat_parts[2]);
                          echo $part1 . ' - ' . '<span dir="rtl" style="display:inline-block;">' . $part2 . '</span>' . ' - ' . $part3;
                        } else {
                          echo htmlspecialchars($immat);
                        }
                        ?>
                      </li>
                      <li class="list-group-item"><strong>Numéro de Police:</strong> <?php echo htmlspecialchars($info['n_policy']); ?></li>
                      <li class="list-group-item"><strong>Date de Fin:</strong> <?php echo htmlspecialchars($info['end_date']); ?></li>
                      <li class="list-group-item"><strong>Montant à Payer:</strong> <?php echo htmlspecialchars($info['montant_to_paie']) . ' DH'; ?></li>
                      <li class="list-group-item"><strong>Reste:</strong> <?php echo htmlspecialchars($info['reste']) . ' DH'; ?></li>
                    </ul>
                    <div class="mt-4">
                      <form method="POST" action="">                        <div class="form-group">
                          <label for="montant">Montant payé</label>
                          <input type="number" step="0.01" min="0" class="form-control" name="montant" id="montant" required 
                                 value="<?php echo htmlspecialchars($_POST['montant'] ?? ''); ?>">
                        </div>
                        <div class="form-group">
                          <label for="paiement_mode">Mode de paiement</label>                          <select class="form-control" id="paiement_mode" name="paiement_mode" required>
                              <option value="" disabled selected>Choisir le mode de paiement</option>
                              <?php foreach ($paiement_modes as $mode): ?>
                                  <option value="<?php echo htmlspecialchars($mode); ?>" <?php if (!empty($_POST['paiement_mode']) && $_POST['paiement_mode'] === $mode) echo 'selected'; ?>>
                                      <?php echo htmlspecialchars($mode); ?>
                                  </option>
                              <?php endforeach; ?>
                          </select>
                        </div>                        <div class="form-group" id="paiement_ref_group" style="display:none;">
                          <label for="paiement_ref">Numéro de référence (chèque/effet...)</label>
                          <input type="text" class="form-control" id="paiement_ref" name="paiement_ref" value="<?php echo htmlspecialchars($_POST['paiement_ref'] ?? ''); ?>" disabled>
                        </div>
                        <div class="form-group" id="echeance_date_group" style="display:none;">
                          <label for="echeance_date">Date d'échéance</label>
                          <input type="date" class="form-control" id="echeance_date" name="echeance_date" value="<?php echo htmlspecialchars($_POST['echeance_date'] ?? ''); ?>" disabled>
                        </div>
                        <div class="form-group" id="next_paiement_group" style="display:none;">
                          <label for="next_paiement_date">Date du prochain paiement (obligatoire si paiement partiel)</label>
                          <input type="date" class="form-control" id="next_paiement_date" name="next_paiement_date" value="<?php echo htmlspecialchars($_POST['next_paiement_date'] ?? ''); ?>">
                        </div>
                        <?php if ($error): ?>
                          <div class="alert alert-danger mt-2"><?php echo $error; ?></div>
                        <?php endif; ?>
                        <button type="submit" class="btn btn-primary">Valider le paiement</button>
                        <a href="policys_table.php" class="btn btn-secondary">Annuler</a>
                      </form>
                    </div>
                  <?php else: ?>
                    <div class="alert alert-danger">Aucune information trouvée pour cette police.</div>
                  <?php endif; ?>
                </div>
              </div>
            </div>
          </div>
          <!--Row-->
        </div>
        <!---Container Fluid-->
      </div>
      <?php include ('includes/footer.php'); ?>
    </div>
  </div>
  <script src="vendor/jquery/jquery.min.js"></script>
  <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
  <script src="vendor/jquery-easing/jquery.easing.min.js"></script>
  <script src="js/ruang-admin.min.js"></script>  <script>
    // Afficher/cacher les champs numéro et date uniquement pour CHEQUE ou EFFET
    function togglePaiementRef() {
      var mode = $('#paiement_mode').val();
      if (mode && (mode.toUpperCase() === 'CHEQUE' || mode.toUpperCase() === 'EFFET')) {
        $('#paiement_ref_group').show();
        $('#paiement_ref').prop('disabled', false);
        $('#echeance_date_group').show();
        $('#echeance_date').prop('disabled', false);
      } else {
        $('#paiement_ref_group').hide();
        $('#paiement_ref').val('').prop('disabled', true);
        $('#echeance_date_group').hide();
        $('#echeance_date').val('').prop('disabled', true);
        
        // Si c'est espèce ou virement bancaire, définir automatiquement la date d'échéance à aujourd'hui
        if (mode && ['ESPECE', 'VIREMENT BANCAIRE'].includes(mode.toUpperCase())) {
          var today = new Date().toISOString().split('T')[0];
          $('#echeance_date').val(today);
        }
      }
    }
    $(document).ready(function () {
      $('#paiement_mode').on('change', togglePaiementRef);
      togglePaiementRef();
    });
  </script>
  <script>
    // Gérer l'affichage du champ prochaine date de paiement selon montant partiel
    document.addEventListener('DOMContentLoaded', function(){
      var montantInput = document.getElementById('montant');
      var nextGroup = document.getElementById('next_paiement_group');
      var nextDate = document.getElementById('next_paiement_date');
      var reste = <?php echo isset($info['reste']) ? json_encode((float)$info['reste']) : '0'; ?>;
      function refreshNext(){
        var val = parseFloat(montantInput.value.replace(',', '.'));
        if(!isNaN(val) && val>0 && val < reste){
          nextGroup.style.display='block';
          nextDate.required = true;
        } else {
          nextGroup.style.display='none';
          nextDate.required = false; nextDate.value='';
        }
      }
      montantInput.addEventListener('input', refreshNext);
      refreshNext();
    });
  </script>
  <script>
  document.addEventListener('DOMContentLoaded', function () {
    const paiementModeSelect = document.querySelector('select[name="paiement_mode"]');
    const paiementRefInput = document.querySelector('input[name="paiement_ref"]');
    const echeanceDateInput = document.querySelector('input[name="echeance_date"]');
    const form = document.querySelector('form');

    function toggleFields() {
      const mode = paiementModeSelect.value.toUpperCase();
      if (mode === 'CHEQUE' || mode === 'EFFET') {
        paiementRefInput.parentElement.style.display = 'block';
        echeanceDateInput.parentElement.style.display = 'block';
      } else {
        paiementRefInput.parentElement.style.display = 'none';
        echeanceDateInput.parentElement.style.display = 'none';
        paiementRefInput.value = '';
        echeanceDateInput.value = '';
      }
    }

    paiementModeSelect.addEventListener('change', toggleFields);

    form.addEventListener('submit', function (e) {
      const mode = paiementModeSelect.value.toUpperCase();
      let errorMessage = '';

      if (!paiementModeSelect.value) {
        errorMessage = 'Le mode de paiement est obligatoire.';
      } else if ((mode === 'CHEQUE' || mode === 'EFFET') && !paiementRefInput.value) {
        errorMessage = 'Le numéro de référence est obligatoire pour ce mode de paiement.';
      } else if ((mode === 'CHEQUE' || mode === 'EFFET') && !echeanceDateInput.value) {
        errorMessage = 'La date d\'échéance est obligatoire pour ce mode de paiement.';
      }

      if (errorMessage) {
        e.preventDefault();
        alert(errorMessage);
      }
    });

    // Initialize field visibility on page load
    toggleFields();
  });
</script>
</body>
</html>