<?php
/**
 * Contrato de Prestación de Servicios SaaS — Tykun
 *
 * Uso: contrato_saas.php?saas_id=5
 *      contrato_saas.php?person_id=12  (legacy, sigue funcionando)
 *
 * Si el registro SaaS tiene person_id vinculado, toma los datos del cliente (person).
 * Si no tiene person_id, usa el nombre de la empresa del registro SaaS.
 * Requiere sesión activa del CRM.
 */
session_start();
require('fpdf186/fpdf.php');

date_default_timezone_set('America/La_Paz');
include 'core/autoload.php';
include 'core/app/model/PersonData.php';
include 'core/app/model/SaasClient.php';

// ---------- Seguridad básica ----------
if (!isset($_SESSION['user_id'])) {
    http_response_code(403);
    exit('Acceso no autorizado.');
}

// ---------- Resolución flexible: saas_id o person_id ----------
$saas   = null;
$person = null;

if (!empty($_GET['saas_id'])) {
    $saas = SaasClient::getById((int)$_GET['saas_id']);
    if (!$saas) {
        http_response_code(404);
        exit('Despliegue SaaS no encontrado.');
    }
    if (!empty($saas->person_id)) {
        $person = PersonData::getById((int)$saas->person_id);
    }
} elseif (!empty($_GET['person_id'])) {
    $person = PersonData::getById((int)$_GET['person_id']);
    if (!$person) {
        http_response_code(404);
        exit('Cliente no encontrado.');
    }
    $saas = SaasClient::getByPersonId((int)$_GET['person_id']);
} else {
    http_response_code(400);
    exit('Se requiere saas_id o person_id.');
}

// ---------- Datos dinámicos ----------
// Nombre del cliente: preferir person, fallback nombre empresa SaaS
if ($person) {
    $clientName = trim(
        (!empty($person->name)   ? $person->name   : '') .
        (!empty($person->name) && !empty($person->name_c) ? ' / ' : '') .
        (!empty($person->name_c) ? $person->name_c : '')
    );
}
if (empty($clientName)) {
    $clientName = $saas ? trim($saas->name) : '';
}
if (empty($clientName)) $clientName = 'Sin nombre';

// Tarifa: preferir saas->tarifa, fallback person->costo_servicio, fallback 150
$tarifaRaw = !empty($saas->tarifa)
    ? (float)$saas->tarifa
    : (!empty($person->costo_servicio) ? (float)$person->costo_servicio : 150.0);
$costoServicio = number_format($tarifaRaw, 2, ',', '.');
$montoLetras = !empty($saas->tarifa_letras) ? $saas->tarifa_letras : (numeroALetras($tarifaRaw) . ' Bolivianos');

// Vigencia y días: de saas con defaults
$vigenciaMeses = !empty($saas->vigencia_meses) ? (int)$saas->vigencia_meses : 3;
$diasAnticipacion = !empty($saas->dias_anticipacion) ? (int)$saas->dias_anticipacion : 15;

// Alcance: de saas con fallback
$alcanceTexto = !empty($saas->alcance)
    ? $saas->alcance
    : "Configuracion del chatbot segun el plan contratado. Acceso a la plataforma web TYKUN. Automatizacion de flujos conversacionales. Soporte tecnico segun el nivel contratado. No incluye desarrollos fuera de alcance ni integraciones no pactadas.";

// Obligaciones proveedor: de saas con fallback
$oblProvTexto = !empty($saas->obligaciones_proveedor)
    ? $saas->obligaciones_proveedor
    : "Garantizar la disponibilidad razonable del servicio. Brindar soporte tecnico. Mantener la confidencialidad de la informacion. Notificar cambios relevantes en el servicio.";

// Obligaciones cliente: de saas con fallback
$oblClieTexto = !empty($saas->obligaciones_cliente)
    ? $saas->obligaciones_cliente
    : "Proveer informacion veraz. Usar el chatbot conforme a la ley. No utilizar el servicio para fines ilicitos. Cumplir con los pagos establecidos.";
function numeroALetras($num) {
    $entero = (int)$num;
    $cents  = round(($num - $entero) * 100);
    $tabla  = [
        0=>'',1=>'Un',2=>'Dos',3=>'Tres',4=>'Cuatro',5=>'Cinco',
        6=>'Seis',7=>'Siete',8=>'Ocho',9=>'Nueve',10=>'Diez',
        11=>'Once',12=>'Doce',13=>'Trece',14=>'Catorce',15=>'Quince',
        16=>'Dieciséis',17=>'Diecisiete',18=>'Dieciocho',19=>'Diecinueve',
        20=>'Veinte',30=>'Treinta',40=>'Cuarenta',50=>'Cincuenta',
        60=>'Sesenta',70=>'Setenta',80=>'Ochenta',90=>'Noventa',
        100=>'Cien',150=>'Ciento Cincuenta',200=>'Doscientos',
        300=>'Trescientos',400=>'Cuatrocientos',500=>'Quinientos',
        600=>'Seiscientos',700=>'Setecientos',800=>'Ochocientos',
        900=>'Novecientos',
    ];
    if (isset($tabla[$entero])) {
        $letras = $tabla[$entero];
    } elseif ($entero < 100) {
        $dec = (int)($entero / 10) * 10;
        $uni = $entero % 10;
        $letras = $tabla[$dec] . ' y ' . strtolower($tabla[$uni]);
    } else {
        $letras = $entero . ' (ver monto)';
    }
    return $letras . ' ' . sprintf('%02d', $cents) . '/100';
}
$montoLetras = numeroALetras($montoNumerico) . ' Bolivianos';

$fechaContrato = !empty($person->inicio_servicio)
    ? date('d \d\e F \d\e Y', strtotime($person->inicio_servicio))
    : date('d \d\e F \d\e Y');

// Traducir mes al español
$meses = [
    'January'=>'enero','February'=>'febrero','March'=>'marzo',
    'April'=>'abril','May'=>'mayo','June'=>'junio',
    'July'=>'julio','August'=>'agosto','September'=>'septiembre',
    'October'=>'octubre','November'=>'noviembre','December'=>'diciembre',
];
foreach ($meses as $en => $es) {
    $fechaContrato = str_replace($en, $es, $fechaContrato);
}

// ---------- Clase PDF ----------
class ContratoPDF extends FPDF
{
    public function __construct()
    {
        parent::__construct('P', 'mm', 'A4');
    }

    function Header()
    {
        // Título del documento
        $this->SetFont('Arial', 'B', 13);
        $this->SetTextColor(30, 30, 30);
        $this->SetXY(14, 10);
        $this->Cell(0, 7, iconv('UTF-8', 'windows-1252', 'CONTRATO DE PRESTACIÓN DE SERVICIOS (SaaS)'), 0, 1, 'C');
        $this->SetFont('Arial', 'B', 12);
        $this->SetXY(14, 18);
        $this->Cell(0, 7, 'CHATBOT TYKUN', 0, 1, 'C');
        // Línea separadora
        $this->SetDrawColor(0, 102, 204);
        $this->SetLineWidth(0.8);
        $this->Line(14, 28, 196, 28);
        $this->Ln(6);
    }

    function Footer()
    {
        $this->SetY(-15);
        $this->SetFont('Arial', 'I', 8);
        $this->SetTextColor(150, 150, 150);
        $this->Cell(0, 10, iconv('UTF-8', 'windows-1252', 'Página ') . $this->PageNo() . '/{nb}', 0, 0, 'C');
    }

    // Título de cláusula
    function clausulaTitulo($texto)
    {
        $this->SetFont('Arial', 'B', 10);
        $this->SetTextColor(0, 51, 153);
        $this->SetFillColor(240, 245, 255);
        $this->Cell(0, 7, iconv('UTF-8', 'windows-1252', $texto), 0, 1, 'L', true);
        $this->SetTextColor(30, 30, 30);
        $this->Ln(1);
    }

    // Párrafo normal
    function parrafo($texto, $sangria = false)
    {
        $this->SetFont('Arial', '', 9.5);
        $this->SetTextColor(30, 30, 30);
        if ($sangria) $this->SetX(18);
        $this->MultiCell(0, 5.5, iconv('UTF-8', 'windows-1252', $texto), 0, 'J');
        $this->Ln(2);
    }

    // Lista con guión
    function itemLista($texto)
    {
        $this->SetFont('Arial', '', 9.5);
        $this->SetX(18);
        $this->Cell(4, 5.5, chr(150), 0, 0, 'L'); // guión largo
        $this->MultiCell(0, 5.5, iconv('UTF-8', 'windows-1252', $texto), 0, 'L');
    }
}

// ---------- Generar PDF ----------
$pdf = new ContratoPDF();
$pdf->AliasNbPages();
$pdf->AddPage();
$pdf->SetMargins(14, 32, 14);
$pdf->SetAutoPageBreak(true, 20);

// Introducción
$pdf->parrafo(
    'Conste por el presente Contrato de Prestación de Servicios bajo la modalidad Software como Servicio (SaaS), ' .
    'que celebran por una parte TYKUN, en adelante EL PROVEEDOR, y por otra parte ' . $clientName . ', ' .
    'en adelante el CLIENTE, bajo las siguientes cláusulas:'
);
$pdf->Ln(2);

// Cláusula 1
$pdf->clausulaTitulo('PRIMERA. OBJETO');
$pdf->parrafo(
    'EL PROVEEDOR presta al CLIENTE el servicio de acceso, uso y operación del Chatbot TYKUN, incluyendo ' .
    'su configuración inicial, despliegue, mantenimiento y soporte, bajo el modelo Software como Servicio (SaaS).'
);

// Cláusula 2
$pdf->clausulaTitulo('SEGUNDA. ALCANCE DEL SERVICIO');
$pdf->parrafo('El servicio incluye:');
foreach (explode("\n", trim($alcanceTexto)) as $item) {
    $item = trim($item);
    if (!empty($item)) $pdf->itemLista($item);
}
$pdf->Ln(2);

// Cláusula 3
$pdf->clausulaTitulo('TERCERA. OBLIGACIONES DEL PROVEEDOR');
foreach (explode("\n", trim($oblProvTexto)) as $item) {
    $item = trim($item);
    if (!empty($item)) $pdf->itemLista($item);
}
$pdf->Ln(2);

// Cláusula 4
$pdf->clausulaTitulo('CUARTA. OBLIGACIONES DEL CLIENTE');
foreach (explode("\n", trim($oblClieTexto)) as $item) {
    $item = trim($item);
    if (!empty($item)) $pdf->itemLista($item);
}
$pdf->Ln(2);

// Cláusula 5
$pdf->clausulaTitulo('QUINTA. TARIFAS Y FORMA DE PAGO');
$pdf->parrafo(
    'La tarifa establecida para este servicio es de Bs. ' . $costoServicio . ' (' . $montoLetras . '), ' .
    'expresadas en moneda local. El pago es mensual y anticipado, salvo acuerdo distinto por escrito.'
);

// Cláusula 6
$pdf->clausulaTitulo('SEXTA. VIGENCIA');
$pdf->parrafo(
    'El presente contrato tiene una vigencia inicial de ' . $vigenciaMeses . ' meses, renovable automáticamente, ' .
    'salvo notificación escrita con al menos ' . $diasAnticipacion . ' días de anticipación.'
);

// Cláusula 7
$pdf->clausulaTitulo('SÉPTIMA. PROPIEDAD INTELECTUAL');
$pdf->parrafo(
    'El software, flujos, arquitectura y metodología del Chatbot TYKUN son propiedad exclusiva de EL PROVEEDOR. ' .
    'La información registrada e ingresada al Chatbot TYKUN es de propiedad del cliente, quedando a resguardo ' .
    'de EL PROVEEDOR durante la vigencia del presente contrato.'
);

// Cláusula 8
$pdf->clausulaTitulo('OCTAVA. CONFIDENCIALIDAD Y DATOS');
$pdf->parrafo(
    'Ambas partes se comprometen a mantener confidencial la información intercambiada. ' .
    'EL PROVEEDOR no comercializa datos del CLIENTE.'
);

// Cláusula 9
$pdf->clausulaTitulo('NOVENA. LIMITACIÓN DE RESPONSABILIDAD');
$pdf->parrafo(
    'EL PROVEEDOR no será responsable por daños indirectos, pérdida de ingresos o fallas ' .
    'derivadas de servicios de terceros.'
);

// Cláusula 10
$pdf->clausulaTitulo('DÉCIMA. TERMINACIÓN');
$pdf->parrafo(
    'Cualquiera de las partes podrá dar por terminado el contrato por incumplimiento grave, ' .
    'previa notificación escrita.'
);

// Cláusula 11
$pdf->clausulaTitulo('DÉCIMA PRIMERA. LEGISLACIÓN APLICABLE');
$pdf->parrafo(
    'El presente contrato se rige por las leyes del Estado Plurinacional de Bolivia.'
);

// ---------- Firmas ----------
$pdf->Ln(8);
$pdf->SetFont('Arial', 'B', 10);
$pdf->SetTextColor(0, 51, 153);
$pdf->Cell(0, 7, 'FIRMAS', 0, 1, 'C');
$pdf->SetDrawColor(0, 102, 204);
$pdf->SetLineWidth(0.4);
$pdf->Line(14, $pdf->GetY(), 196, $pdf->GetY());
$pdf->Ln(10);

$pdf->SetFont('Arial', '', 9.5);
$pdf->SetTextColor(30, 30, 30);

// Dos columnas de firma
$xLeft  = 20;
$xRight = 115;
$yFirma = $pdf->GetY();
$lineW  = 75;

// Líneas de firma
$pdf->SetDrawColor(100, 100, 100);
$pdf->SetLineWidth(0.3);
$pdf->Line($xLeft,  $yFirma, $xLeft + $lineW,  $yFirma);
$pdf->Line($xRight, $yFirma, $xRight + $lineW, $yFirma);

$pdf->Ln(2);
$pdf->SetX($xLeft);
$pdf->Cell($lineW, 5, 'EL PROVEEDOR', 0, 0, 'C');
$pdf->SetX($xRight);
$pdf->Cell($lineW, 5, 'EL CLIENTE', 0, 1, 'C');

$pdf->Ln(1);
$pdf->SetFont('Arial', 'I', 8.5);
$pdf->SetX($xLeft);
$pdf->Cell($lineW, 5, 'TYKUN', 0, 0, 'C');
$pdf->SetX($xRight);
$pdf->Cell($lineW, 5, iconv('UTF-8', 'windows-1252', $clientName), 0, 1, 'C');

$pdf->Ln(8);
$pdf->SetFont('Arial', '', 9.5);
$pdf->SetTextColor(30, 30, 30);
$pdf->Cell(0, 6, iconv('UTF-8', 'windows-1252', 'Lugar y fecha: La Paz, ' . $fechaContrato), 0, 1, 'C');

// ---------- Salida ----------
$filename = 'Contrato_Tykun_' . preg_replace('/[^a-zA-Z0-9_-]/', '_', $clientName) . '.pdf';
$pdf->Output('I', $filename);
exit;
