<?php
/**
 * ASISMA CRM - Pasarela de pagos Flow (flow.cl)
 *
 * Configuración en config_sistema (vacías = integración desactivada):
 *   - FLOW_API_KEY     API Key del comercio
 *   - FLOW_SECRET_KEY  Secret Key (firma HMAC-SHA256)
 *   - FLOW_API_URL     https://sandbox.flow.cl/api (pruebas) o https://www.flow.cl/api
 *
 * Flujo: el cliente acepta la cotización → botón "Pagar ahora" → payment/create
 * → redirección a Flow → Flow confirma por POST a /api/flow/confirmacion →
 * payment/getStatus → si está pagada, la cotización pasa a 'pagada' y el lead
 * a GANADO (disparando las integraciones de Control Empresas y facturación).
 */
class FlowHelper {

    /** Lee la configuración desde config_sistema. */
    public static function config() {
        $db = Database::getInstance();
        $out = array();
        foreach (array('FLOW_API_KEY', 'FLOW_SECRET_KEY', 'FLOW_API_URL') as $clave) {
            $row = $db->fetchOne("SELECT valor FROM config_sistema WHERE clave = :c LIMIT 1", array('c' => $clave));
            $out[$clave] = $row ? trim($row['valor']) : '';
        }
        return $out;
    }

    /** ¿La integración está configurada y activa? */
    public static function activo() {
        $cfg = self::config();
        return $cfg['FLOW_API_KEY'] !== '' && $cfg['FLOW_SECRET_KEY'] !== '' && $cfg['FLOW_API_URL'] !== '';
    }

    /**
     * Firma Flow: concatenar nombre+valor de los parámetros ordenados
     * alfabéticamente y aplicar HMAC-SHA256 con la Secret Key.
     */
    public static function firmar($params, $secreto) {
        ksort($params);
        $cadena = '';
        foreach ($params as $clave => $valor) {
            $cadena .= $clave . $valor;
        }
        return hash_hmac('sha256', $cadena, $secreto);
    }

    /**
     * Crea la orden de pago de una cotización.
     * Devuelve array('success', 'url_pago'|'detalle', 'flow_orden').
     */
    public static function crearPago($cotiz, $emailCliente) {
        $cfg = self::config();
        if (!self::activo()) {
            return array('success' => false, 'detalle' => 'La pasarela Flow no está configurada.');
        }

        $ordenComercio = 'COT-' . (int)$cotiz['id'] . '-' . date('YmdHis');
        $params = array(
            'apiKey'          => $cfg['FLOW_API_KEY'],
            'commerceOrder'   => $ordenComercio,
            'subject'         => 'Cotización ASISMA ' . folio_cotizacion($cotiz),
            'currency'        => 'CLP',
            'amount'          => (int)round($cotiz['total']),
            'email'           => $emailCliente ? $emailCliente : 'clientes@asisma.cl',
            'urlConfirmation' => APP_URL . '/api/flow/confirmacion',
            'urlReturn'       => APP_URL . '/cotizaciones/publica?h=' . $cotiz['hash']
        );
        $params['s'] = self::firmar($params, $cfg['FLOW_SECRET_KEY']);

        $res = self::post($cfg['FLOW_API_URL'] . '/payment/create', $params);
        if ($res['http_code'] === 200 && isset($res['data']['url']) && isset($res['data']['token'])) {
            return array(
                'success'    => true,
                'url_pago'   => $res['data']['url'] . '?token=' . $res['data']['token'],
                'flow_orden' => $ordenComercio,
                'token'      => $res['data']['token']
            );
        }

        $motivo = isset($res['data']['message']) ? $res['data']['message'] : ('HTTP ' . $res['http_code']);
        error_log('[FlowHelper] payment/create falló: ' . $motivo);
        return array('success' => false, 'detalle' => 'Flow rechazó la creación del pago: ' . $motivo);
    }

    /**
     * Consulta el estado de un pago por token.
     * Estados Flow: 1 pendiente, 2 PAGADA, 3 rechazada, 4 anulada.
     * Devuelve array('success', 'status', 'commerceOrder', 'detalle').
     */
    public static function estadoPago($token) {
        $cfg = self::config();
        if (!self::activo()) {
            return array('success' => false, 'detalle' => 'La pasarela Flow no está configurada.');
        }

        $params = array('apiKey' => $cfg['FLOW_API_KEY'], 'token' => $token);
        $params['s'] = self::firmar($params, $cfg['FLOW_SECRET_KEY']);

        $url = $cfg['FLOW_API_URL'] . '/payment/getStatus?' . http_build_query($params);
        $res = self::get($url);

        if ($res['http_code'] === 200 && isset($res['data']['status'])) {
            return array(
                'success'       => true,
                'status'        => (int)$res['data']['status'],
                'commerceOrder' => isset($res['data']['commerceOrder']) ? $res['data']['commerceOrder'] : '',
                'detalle'       => 'Estado consultado.'
            );
        }
        $motivo = isset($res['data']['message']) ? $res['data']['message'] : ('HTTP ' . $res['http_code']);
        return array('success' => false, 'detalle' => 'No se pudo consultar el pago en Flow: ' . $motivo);
    }

    // ─────────────────────────────────────────────────────────────────────────

    private static function post($url, $params) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        $cuerpo = curl_exec($ch);
        $codigo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return array('http_code' => $codigo, 'data' => json_decode($cuerpo, true));
    }

    private static function get($url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        $cuerpo = curl_exec($ch);
        $codigo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return array('http_code' => $codigo, 'data' => json_decode($cuerpo, true));
    }
}
