<?php

namespace Predial\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Predial\Area;
use Predial\ParametrizacionAnio;
use Predial\Predio;
use Predial\Propietario;
use PDF;

class ExtractoController extends Controller{
    /**
     * @function index
     * @param $predio string Id de predio codificada
     * @return view_pdf function Función para generar vista pdf
     * */
    public function index($predio){

        $param = ParametrizacionAnio::find(session()->get('anno'));
        $valParamA= $param->id_unico;
        $facturaUl  = DB::table('gr_factura_predial')
        ->select('parametrizacionanno')                               
        ->orderBy('id_unico', 'desc')
        ->take(1)
        ->first();
        $valParamU= $facturaUl->parametrizacionanno;
        if ($valParamA<$valParamU) {
            $valAnnoPa= $param->anno;
            $annoPu  = DB::table('gf_parametrizacion_anno')
            ->select('anno')                               
            ->Where('id_unico', '=', $valParamU)
            ->first();
            $valAnnoPU= $annoPu->anno;
            flash()->overlay("No se pueden generar extractos con parametrización año anterior ($valAnnoPa) a la ya creada ($valAnnoPU).", "Información");
            return back();
        }else{
        $id_predio = decrypt($predio);

        $compania = DB::table('gf_tercero as ter')
                    ->select(
                            DB::raw('UPPER(ter.razonsocial) as razonsocial'),
                            DB::raw('UPPER(ti.nombre) as tipodoc'),
                            DB::raw('CONCAT_WS(" - ",ter.numeroidentificacion,ter.digitoverficacion) as numeroi'),
                            'dir.direccion', 'tel.valor as telefono', 'ter.ruta_logo as logo'
                            )
                    ->leftJoin('gf_tipo_identificacion as ti' ,'ter.tipoidentificacion', '=', 'ti.id_unico')
                    ->leftJoin('gf_direccion as dir', 'dir.tercero', '=', 'ter.id_unico')
                    ->leftJoin('gf_telefono as tel', 'tel.tercero', '=', 'ter.id_unico')
                    ->where('ter.id_unico', '=', session()->get('compania'))
                    ->first();

        return ExtractoController::view_pdf($compania, $id_predio);
      }
    }

    public static function view_pdf($compania, $predio){
        $meses = array('no','Enero','Febrero','Marzo','Abril', 'Mayo','Junio','Julio','Agosto','Septiembre', 'Octubre','Noviembre','Diciembre');
        $mes   = $meses[(int) date("m")];
        $date  = date('d')." de $mes de ".date('Y');

        $datap = Predio::find($predio);
        $prop  = ExtractoController::obtnerPropietario($predio);
        $param = ExtractoController::obtnerParametrizacionAnno();
        $area  = ExtractoController::obtnerArea($predio, $param->anno);
        $ultan = ExtractoController::obtnerultimoannopago($predio);
        $ulpag = ExtractoController::obtnerUltimoPago($predio);
        $conts = ExtractoController::obtnerConceptosVigenciaActual($param->anno);
        $props = ExtractoController::obtenerCoopropietarios($predio);
        $vista = "pdf.extracto";
        $view  = \View::make($vista, compact('compania', 'date', 'datap', 'prop', 'area', 'ultan', 'ulpag', 'conts', 'props'))->render();
        $pdf   = \App::make('dompdf.wrapper');
        $pdf->loadHTML($view);
        return  $pdf->stream("Extracto.pdf");
    }

    public static function obtnerPropietario($predio){
        $data_pre = DB::table('gp_tercero_predio')->where('predio', '=', $predio)->where('propietario', '=', 0)->first();
        if(!empty($data_pre->tercero))
            $data = Propietario::find($data_pre->tercero);
        else
            $data = "";

        return $data;
    }

    public static function obtnerArea($predio, $anno){
        $area = Area::where('predio', $predio)
                    ->where('anio', $anno)
                    ->where('tipoarea', 1)
                    ->first();
        return $area;
    }

    public static function obtnerParametrizacionAnno(){
        $param = ParametrizacionAnio::find(session()->get('anno'));
        return $param;
    }

    public static function obtnerultimoannopago($predio){
        $data = DB::table('gr_ultimo_ano_pago')->where('predio', '=', $predio)->max('anno');
        return $data;
    }

    public static function obtnerUltimoPago($predio){
        $data = DB::table('gr_pago_predial as pag')
                ->select(
                    DB::raw('DATE_FORMAT(pag.fechapago, "%d/%m/%Y") as fechapago'),
                    DB::raw('SUM(dtp.valor) as valor'),
                    'fat.numero as recibo'
                )
                ->leftJoin('gr_detalle_pago_predial as dtp', 'dtp.pago', '=', 'pag.id_unico')
                ->leftJoin('gr_detalle_factura_predial as dtf', 'dtp.detallefactura', '=', 'dtf.id_unico')
                ->leftJoin('gr_factura_predial as fat', 'dtf.factura', '=', 'fat.id_unico')
                ->where('fat.predio', '=', $predio)
                ->orderBy('pag.id_unico', 'desc')
                ->groupBy('pag.id_unico')
                ->first();
        return $data;
    }

    public static function obtnerConceptosVigenciaActual($anno){
        $data = DB::table('gr_concepto_predial as cp')
            ->select('c.nombre as nombre', 'c.id_unico as id')
            ->leftJoin('gr_concepto as c', 'cp.id_concepto', '=', 'c.id_unico')
            ->where('cp.anno', '=', $anno)
            ->orderBy('c.id_unico','ASC')
            ->get();
        return $data;
    }

    public static function convertirPeso($valor){
        $dec   = substr($valor, -3);
        if($dec >= 500){
            $valor = round($valor);
        }else{
            $valor = intval($valor);
        }
        return $valor;
    }

    /**
    @function num2letras ()
    @abstract Dado un n?mero lo devuelve escrito.
    @param $num number - Número a convertir.
    @param $fem bool - Forma femenina (true) o no (false).
    @param $dec bool - Con decimales (true) o no (false).
    @result string - Devuelve el número escrito en letra.
    */
    public static function num2letras($num, $fem = false, $dec = true, $np = NULL) {
        
        $matuni[2]      = "dos";
        $matuni[3]      = "tres";
        $matuni[4]      = "cuatro";
        $matuni[5]      = "cinco";
        $matuni[6]      = "seis";
        $matuni[7]      = "siete";
        $matuni[8]      = "ocho";
        $matuni[9]      = "nueve";
        $matuni[10]     = "diez";
        $matuni[11]     = "once";
        $matuni[12]     = "doce";
        $matuni[13]     = "trece";
        $matuni[14]     = "catorce";
        $matuni[15]     = "quince";
        $matuni[16]     = "dieciseis";
        $matuni[17]     = "diecisiete";
        $matuni[18]     = "dieciocho";
        $matuni[19]     = "diecinueve";
        $matuni[20]     = "veinte";
        $matunisub[2]   = "dos";
        $matunisub[3]   = "tres";
        $matunisub[4]   = "cuatro";
        $matunisub[5]   = "quin";
        $matunisub[6]   = "seis";
        $matunisub[7]   = "sete";
        $matunisub[8]   = "ocho";
        $matunisub[9]   = "nove";
        $matdec[2]      = "veint";
        $matdec[3]      = "treinta";
        $matdec[4]      = "cuarenta";
        $matdec[5]      = "cincuenta";
        $matdec[6]      = "sesenta";
        $matdec[7]      = "setenta";
        $matdec[8]      = "ochenta";
        $matdec[9]      = "noventa";
        $matsub[3]      = 'mill';
        $matsub[5]      = 'bill';
        $matsub[7]      = 'mill';
        $matsub[9]      = 'trill';
        $matsub[11]     = 'mill';
        $matsub[13]     = 'bill';
        $matsub[15]     = 'mill';
        $matmil[4]      = 'millones';
        $matmil[6]      = 'billones';
        $matmil[7]      = 'de billones';
        $matmil[8]      = 'millones de billones';
        $matmil[10]     = 'trillones';
        $matmil[11]     = 'de trillones';
        $matmil[12]     = 'millones de trillones';
        $matmil[13]     = 'de trillones';
        $matmil[14]     = 'billones de trillones';
        $matmil[15]     = 'de billones de trillones';
        $matmil[16]     = 'millones de billones de trillones';
        //Zi hack
        $float = explode('.',$num);
        $num   = $float[0];
        $num   = trim((string)@$num);
        if ($num[0] == '-') {
            $neg = 'menos ';
            $num = substr($num, 1);
        }else
            $neg = '';

        while ($num[0] == '0') $num = substr($num, 1);
        if ($num[0] < '1' or $num[0] > 9) $num = '0' . $num;
        $zeros = true;
        $punt = false;
        $ent = '';
        $fra = '';
        for ($c = 0; $c < strlen($num); $c++) {
            $n = $num[$c];
            if (! (strpos(".,'''", $n) === false)) {
                if ($punt) break;
                else{
                    $punt = true;
                    continue;
                }
            }elseif (! (strpos('0123456789', $n) === false)) {
                if ($punt) {
                    if ($n != '0') $zeros = false;
                    $fra .= $n;
                }else
                    $ent .= $n;
            }else
                break;
        }
        $ent = '     ' . $ent;
        if ($dec and $fra and ! $zeros) { 
            $fin = ' coma';
            for ($n = 0; $n < strlen($fra); $n++) {
                if (($s = $fra[$n]) == '0')
                    $fin .= ' cero';
                elseif ($s == '1')
                    $fin .= $fem ? ' una' : ' un';
                else
                    $fin .= ' ' . $matuni[$s];
            }
        }else
            $fin = '';
        if ((int)$ent === 0) return 'Cero ' . $fin;
        $tex = '';
        $sub = 0;
        $mils = 0;
        $neutro = false;
        while ( ($num = substr($ent, -3)) != '   ') {
            $ent = substr($ent, 0, -3);
            if (++$sub < 3 and $fem) {
                $matuni[1] = 'una';
                $subcent = 'as';
            }else{
                $matuni[1] = $neutro ? 'un' : 'uno';
                $subcent = 'os';
            }
            $t = '';
            $n2 = substr($num, 1);
            if ($n2 == '00') {
            }elseif ($n2 < 21)
                $t = ' ' . $matuni[(int)$n2];
            elseif ($n2 < 30) {
                $n3 = $num[2];
            if ($n3 != 0) $t = 'i' . $matuni[$n3];
                $n2 = $num[1];
                $t = ' ' . $matdec[$n2] . $t;
            }else{
                $n3 = $num[2];
                if ($n3 != 0) $t = ' y ' . $matuni[$n3];
                $n2 = $num[1];
                $t = ' ' . $matdec[$n2] . $t;
            }
            $n = $num[0];
            if ($n == 1) {
                $t = ' ciento' . $t;
            }elseif ($n == 5){
                $t = ' ' . $matunisub[$n] . 'ient' . $subcent . $t;
            }elseif ($n != 0){
                $t = ' ' . $matunisub[$n] . 'cient' . $subcent . $t;
            }
            if ($sub == 1) {
            }elseif (! isset($matsub[$sub])) {
                if ($num == 1) {
                    $t = ' mil';
                }elseif ($num > 1){
                    $t .= ' mil';
                }
            }elseif ($num == 1) {
                $t .= ' ' . $matsub[$sub] . 'on';
            }elseif ($num > 1){
                $t .= ' ' . $matsub[$sub] . 'ones';
            }
            if ($num == '000') $mils ++;
            elseif ($mils != 0) {
                if (isset($matmil[$sub])) $t .= ' ' . $matmil[$sub];
                    $mils = 0;
            }
            $neutro = true;
            $tex = $t . $tex;
        }
        $tex = $neg . substr($tex, 1) . $fin;
        //Zi hack --> return ucfirst($tex);
        //.$float[1].'/100 M.N.'
        if($np == NULL){
            $end_num=ucfirst($tex).' pesos ';
        }else{
            $end_num=ucfirst($tex);
        }
        return $end_num;
    }

    public static function obtenerCoopropietarios($predio){
        $data = DB::table('gp_tercero_predio as tpr')
                    ->select('pro.nombres')
                    ->leftJoin('gr_propietarios as pro', 'tpr.tercero', '=', 'pro.id_unico')
                    ->where('tpr.predio', '=', $predio)
                    ->where('propietario', '=', 1)
                    ->get();
        return $data;
    }
}
