<?php

class PagoIndividual extends Utilidades
{
    protected $ordenPago;
    protected $escenario = 8;
    protected $titulo_proceso = 10;

    public function __construct($ordenPago)
    {
        $this->ordenPago = $ordenPago;
        Yii::import('application.modules.contable.models.*', true);
        Yii::import('application.modules.contable.models.comprobantes.*', true);
    }

    public function contabilizar()
    {
        if (! ParamEscenarios::conectado($this->escenario)) {
            return;
        }

        ////////////////////////////////// COMPROBANTE /////////////////////////////////
        $comprobante = $this->comprobante();

        $this->seguimientoComprobante(
            $comprobante->id,
            $this->ordenPago->id,
            $this->ordenPago->getProcesoPago(),
            $this->titulo_proceso
        );
        ////////////////////////// MOVIMIENTOS DEL COMPROBANTE /////////////////////////
        $this->movimientos($comprobante);
    }

    protected function movimientos($comprobante)
    {
        $movimiento = new Movimiento(
            $comprobante,
            $this->ordenPago->getFechaRegistro()
        );

        $monto_aporte = $this->getMontos();

        $movimiento->crear(
            $this->getCuentaRebajaOrden(),
            $monto_aporte['cta_rebaja_orden']
        );

        $movimiento->crear(
            BancoCuentaContable::get($this->ordenPago->getBancoPago()),
            0,
            $monto_aporte['cta_rebaja_orden_banco']
        );
    }

    protected function getMontos()
    {
        $debe = [
            'cta_rebaja_orden' => $this->ordenPago->monto_pago,
        ];

        $haber = [
            'cta_rebaja_orden_banco' => $this->ordenPago->monto_pago
        ];

        // $this->debug($debe, $haber);

        $this->validate($debe, $haber);

        return array_merge([], $debe, $haber);
    }

    protected function comprobante()
    {
        $this->setProceso($this->ordenPago);

        $comprobante = new Comprobante('crea');
        $comprobante->fecha_comprobante = $this->fechaComprobante();
        $comprobante->descripcion = $this->getDescripcion();
        $comprobante->status = 1;
        $comprobante->nro_documento = $this->ordenPago->rif;

        if (! $comprobante->save()) {
            throw new Exception('Error al generar comprobante contable.', $this->codigo_error);
        }

        return $comprobante;
    }

    protected function getDescripcion()
    {
        return vsprintf('Pago órden de pago: %s%s %s', [
            $this->ordenPago->id_tipo_persona,
            $this->ordenPago->rif,
            $this->ordenPago->razon_social
        ]);
    }

    protected function getCuentaRebajaOrden()
    {
        switch ($this->ordenPago->id_tipo_orden) {
            case 1: /* Proveedor */
                return $this->getIdCuentaProveedor();
            case 2: /* Asociado */
                return Parametros::getCuentaContable([
                    'clave' => 'cta_rebaja_orden_asociado',
                    'escenario' => null,
                    'tipo_parametro' => null,
                    'proceso' => null
                ]);
        }
    }

    private function getIdCuentaProveedor()
    {
        $proveedor = $this->ordenPago->proveedor;

        if (is_null($proveedor->id_cuenta)) {
            throw new Exception("El proveedor <strong>{$this->ordenPago->razon_social}</strong>, no tiene una cuenta auxiliar definida.");
        }

        return $proveedor->id_cuenta;
    }
}
