<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Input;
use App\Http\Requests\IngresoFormRequest;
use App\Models\Ingreso;
use App\Models\Producto;
use App\Models\Persona;
use App\Models\ProductoCompra;

use App\Models\DetalleIngreso;
use DB;

use Illuminate\Support\Facades\Session;

use Carbon\Carbon;
use Response;
use Illuminate\Support\Collection;
use Codedge\Fpdf\Fpdf\Fpdf;

class IngresoController extends Controller
{
    private $fpdf;
    public function __construct()
    {
        $this->middleware('permission:ingreso-list|ingreso-create|ingreso-edit|ingreso-delete', ['only' => ['index', 'show']]);
        $this->middleware('permission:ingreso-create', ['only' => ['create', 'store']]);
        $this->middleware('permission:ingreso-edit', ['only' => ['edit', 'update']]);
        $this->middleware('permission:ingreso-delete', ['only' => ['destroy']]);
    }

    public function index(Request $request)
    {
        if ($request) {
            $query = trim($request->get('searchText'));

            $ingresos = DB::table('ingreso as i')
                ->join('persona as p', 'i.idproveedor', '=', 'p.idpersona')
                ->join('productos as pr', 'i.id_producto', '=', 'pr.id_producto')
                ->select('i.*', 'p.nombre', 'pr.nombre as nombre_producto')
                ->where('p.nombre','LIKE','%'.$query.'%')
                ->orwhere('pr.nombre','LIKE','%'.$query.'%')
                ->orwhere('fecha_hora','LIKE','%'.$query.'%')
                ->orwhere('tipo_comprobante','LIKE','%'.$query.'%')
                ->orwhere('impuesto','LIKE','%'.$query.'%')
                ->orderBy('i.idingreso', 'desc')
                ->paginate(10);

            return view('compras.ingreso.index', ["ingresos" => $ingresos, "searchText" => $query]);
        }
    }



    public function create()
    {
        $personas = DB::table('persona')->where('tipo_persona', '=', 'Proveedor')->get();
        $productos = Producto::all();
        return view("compras.ingreso.create", ["personas" => $personas, "productos" => $productos]);
    }

    public function store(IngresoFormRequest $request)
    {
        try {
            DB::beginTransaction();
            $ingreso = new Ingreso;
            $ingreso->idproveedor = $request->get('idproveedor');
            $ingreso->tipo_comprobante = $request->get('tipo_comprobante');
            $ingreso->serie_comprobante = $request->get('serie_comprobante');
            $ingreso->num_comprobante = $request->get('num_comprobante');
            $ingreso->id_producto = $request->get('pidarticulo');

            $mytime = Carbon::now('America/Santo_Domingo');
            $ingreso->fecha_hora = $mytime->toDateTimeString();
            if ($request->get('impuesto') == '1') {
                $ingreso->impuesto = '18';
            } else {
                $ingreso->impuesto = '0';
            }
            $ingreso->estado = 'Activo';
            $ingreso->save();

            $idarticulo = $request->get('idarticulo');
            $cantidad = $request->get('cantidad');
            $precio_compra = $request->get('precio_compra');
            $precio_venta = $request->get('precio_venta');

            // Get the nombre of the persona associated with the idproveedor
            $nombre_proveedor = Persona::find($ingreso->idproveedor)->nombre;

            $cont = 0;

            while ($cont < count($idarticulo)) {
                $detalle = Producto::find($idarticulo[$cont]);
                if ($detalle->cantidad_compradas == 0) {
                    $detalle->cantidad_compradas = $cantidad[$cont];
                } else {
                    $detalle->cantidad_compradas += $cantidad[$cont];
                }
                $detalle->precio_total = $precio_compra[$cont];
                $detalle->precio_venta = $precio_venta[$cont];
                $detalle->suplidor = $nombre_proveedor;
                $detalle->fecha_compra = now();

                $detalle->update();
                $cont = $cont + 1;
            }

            DB::commit();
        } catch (exception $e) {
            DB::rollback();
        }

        session::flash('statuscode', 'success');
        return Redirect::to('compras/ingreso')->with('status', 'Compra creada con éxito.');
    }



    public function show($id)
    {
        $ingreso = DB::table('ingreso as i')
            ->join('persona as p', 'i.idproveedor', '=', 'p.idpersona')
            ->join('detalle_ingreso as di', 'i.idingreso', '=', 'di.idingreso')
            ->select('i.idingreso', 'i.fecha_hora', 'p.nombre', 'i.tipo_comprobante', 'i.serie_comprobante', 'i.num_comprobante', 'i.impuesto', 'i.estado', DB::raw('sum(di.cantidad*di.precio_compra) as total'))
            ->groupBy('i.idingreso', 'i.fecha_hora', 'p.nombre', 'i.tipo_comprobante', 'i.serie_comprobante', 'i.num_comprobante', 'i.impuesto', 'i.estado')
            ->where('i.idingreso', '=', $id)
            ->first();
            
        $detalles = DB::table('detalle_ingreso as d')
            ->join('articulo as a', 'd.idarticulo', '=', 'a.idarticulo')
            ->select('a.nombre as articulo', 'd.cantidad', 'd.precio_compra', 'd.precio_venta')
            ->where('d.idingreso', '=', $id)
            ->get();

        return view("compras.ingreso.show", ['ingreso' => $ingreso, "detalles" => $detalles]);
    }

    public function destroy($id)
    {
        $ingreso = Ingreso::findOrFail($id);
        $ingreso->Estado = 'Anulado';
        $ingreso->save();

        session::flash('statuscode', 'success');
        return Redirect::to('compras/ingreso')->with('status', 'Compra Anulada con éxito.');
    }

    public function anular($id)
    {
        $ingreso = Ingreso::findOrFail($id);
        $ingreso->Estado = 'Anulado';
        $ingreso->save();

        session::flash('statuscode', 'success');
        return Redirect::to('compras/ingreso')->with('status', 'Compra Anulada con éxito.');
    }

    public function reportec($id)
    {
        //Obtengo los datos
        $ingreso = DB::table('ingreso as i')
            ->join('persona as p', 'i.idproveedor', '=', 'p.idpersona')
            ->join('productos as pr', 'i.id_producto', '=', 'pr.id_producto')
            ->select('i.*', 'p.nombre', 'pr.nombre as nombre_producto', 'i.fecha_hora')
            ->orderBy('i.idingreso', 'desc')
            ->paginate(10);

        $detalles = DB::table('detalle_ingreso as d')
            ->join('productos as a', 'd.idarticulo', '=', 'a.id_producto')
            ->select('a.nombre as articulo', 'd.cantidad', 'd.precio_compra', 'd.precio_venta')
            ->where('d.idingreso', '=', $id)
            ->get();

        $empresas = DB::table('empresa')
            ->select('ruc', 'razon_social', 'direccion', 'telefono', 'correo', 'pag_web', 'logo')
            ->first();

        $pdf = new FPDF('P', 'mm', 'A4');
        $pdf->AddPage();
        $pdf->Image('imagenes/empresa/' . $empresas->logo, 10, 20, 40);

        $pdf->SetFont('Arial', 'B', 12);
        $pdf->SetXY(75, 20);
        $pdf->Cell(20, 0, utf8_decode(strtoupper($empresas->razon_social)), 0, 0, 'C');

        $pdf->SetFont('Arial', '', 10);
        $pdf->SetXY(75, 25);
        $pdf->Cell(20, 0, utf8_decode(strtoupper('RUC: ' . $empresas->ruc)), 0, 0, 'C');

        $pdf->SetFont('Arial', '', 10);
        $pdf->SetXY(75, 30);
        $pdf->Cell(20, 0, utf8_decode(strtoupper($empresas->direccion)), 0, 0, 'C');

        $pdf->SetFont('Arial', '', 10);
        $pdf->SetXY(75, 35);
        $pdf->Cell(20, 0, utf8_decode(strtoupper($empresas->correo)), 0, 0, 'C');

        $pdf->SetFont('Arial', '', 10);
        $pdf->SetXY(75, 40);
        $pdf->Cell(20, 0, utf8_decode(strtoupper($empresas->pag_web)), 0, 0, 'C');

        $pdf->SetFont('Arial', '', 10);
        $pdf->SetXY(75, 45);
        $pdf->Cell(20, 0, utf8_decode(strtoupper('celular: ' . $empresas->telefono)), 0, 0, 'C');

        $pdf->SetFont('Arial', '', 9);
        $pdf->SetXY(155, 10);
        $pdf->MultiCell(55, 0, utf8_decode('Fecha Impresión: ' . date('m - d - Y')), 0, 'C');

        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetXY(20, 55);
        $pdf->Cell(30, 0, utf8_decode('RAZON SOCIAL:'), 0, 0, 'C');
        $pdf->SetFont('Arial', '', 10);
        $pdf->SetXY(50, 55);
        $pdf->Cell(0, 0, utf8_decode(strtoupper($empresas->razon_social)));

        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetXY(23, 63);
        $pdf->Cell(20, 0, utf8_decode('DIRECCIÓN:'), 0, 0, 'C');
        $pdf->SetFont('Arial', '', 10);
        $pdf->SetXY(46, 63);
        $pdf->Cell(0, 0, utf8_decode(strtoupper($empresas->direccion)));
        //***Parte de la derecha
        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetXY(163, 55);
        $pdf->Cell(0, 0, utf8_decode('RUC:'), 0, 0);
        $pdf->SetFont('Arial', '', 10);
        $pdf->SetXY(173, 55);
        $pdf->Cell(0, 0, utf8_decode($empresas->ruc));
        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetXY(153, 63);
        $pdf->Cell(0, 0, utf8_decode('TELÉFONO:'), 0, 0);
        $pdf->SetFont('Arial', '', 10);
        $pdf->SetXY(175, 63);
        $pdf->Cell(0, 0, substr($empresas->telefono, 0, 10));
        $total = 0;

        //Mostramos los detalles
        $y = 70;

        $pdf->SetFont('Arial', 'B', 12);
        $pdf->SetXY(20, $y);
        $pdf->Cell(20, 10, 'CANT.', 0, 0, 'C');
        $pdf->SetXY(40, $y);
        $pdf->Cell(110, 10, utf8_decode('DESCRIPCIÓN'));
        $pdf->SetXY(150, $y);
        $pdf->Cell(25, 10, 'P. COMPRA', 0, 0, 'C');
        $pdf->SetXY(175, $y);
        $pdf->Cell(25, 10, 'IMPORTE', 0, 0, 'C'); //end of line
        $pdf->Line(20, 70, 200, 70);
        $pdf->Line(20, 80, 200, 80);

        $y = 82;
        $pdf->SetFont('Arial', '', 12);
        foreach ($ingreso as $det) {
            
            $pdf->SetXY(20, $y);
            $pdf->MultiCell(20, 10, $det->nombre, 0, 'C');

        }

        $pdf->Line(20, 191, 200, 191);
        $pdf->Line(20, 192, 200, 192);
        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetXY(150, 195);
     
   
        $pdf->Output();
        exit;
    }

    public function reporte()
    {

        $ingresos = DB::table('ingreso as i')
            ->join('persona as p', 'i.idproveedor', '=', 'p.idpersona')
            ->join('productos as pr', 'i.id_producto', '=', 'pr.id_producto')
            ->select('i.*', 'p.nombre', 'pr.nombre as nombre_producto')
            ->orderBy('i.idingreso', 'desc')
            ->paginate(10);

        $empresas = DB::table('empresa')
            ->select('ruc', 'razon_social', 'direccion', 'telefono', 'correo', 'pag_web', 'logo')
            ->first();

        $pdf = new FPDF('P', 'mm', 'A4');
        $pdf->AddPage();
        $pdf->Image('imagenes/empresa/' . $empresas->logo, 10, 10, 60);

        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetXY(100, 15);
        $pdf->Cell(20, 0, utf8_decode(strtoupper($empresas->razon_social)), 0, 0, 'C');

        $pdf->SetFont('Arial', '', 9);
        $pdf->SetXY(100, 20);
        $pdf->Cell(20, 0, utf8_decode(strtoupper('RUC: ' . $empresas->ruc)), 0, 0, 'C');

        $pdf->SetFont('Arial', '', 8);
        $pdf->SetXY(100, 24);
        $pdf->Cell(20, 0, utf8_decode(strtoupper($empresas->direccion)), 0, 0, 'C');

        $pdf->SetFont('Arial', '', 8);
        $pdf->SetXY(100, 28);
        $pdf->Cell(20, 0, utf8_decode($empresas->correo . " - " . $empresas->pag_web . " - " . $empresas->telefono), 0, 0, 'C');

        $pdf->SetFont('Arial', 'B', 9);
        $pdf->SetXY(155, 20);
        $pdf->MultiCell(55, 0, utf8_decode('Fecha Impresión'), 0, 'C');
        $pdf->SetFont('Arial', '', 9);
        $pdf->SetXY(155, 25);
        $pdf->MultiCell(55, 0, utf8_decode(date('m - d - Y')), 0, 'C');

        $pdf->SetFont('Arial', 'B', 12);
        $pdf->SetXY(80, 37);
        $pdf->Cell(50, 0, utf8_decode('REPORTE DE COMPRAS'), 0, 0, 'C');

        $pdf->Line(10, 41, 200, 41);
        $pdf->Line(10, 42, 200, 42);

        $pdf->Ln(8);
        $pdf->SetTextColor(0, 0, 0);  // Establece el color del texto
        $pdf->SetFillColor(232, 232, 232); // establece el color del fondo de la celda
        $pdf->SetFont('Arial', 'B', 11);
        //El Ancho de las columnas debe de sumar promedio 190        
        $pdf->cell(30, 8, utf8_decode("Fecha"), 1, "", "C", true);
        $pdf->cell(80, 8, utf8_decode("Proveedor"), 1, "", "C", true);
        $pdf->cell(55, 8, utf8_decode("Comprobante"), 1, "", "C", true);
        $pdf->cell(10, 8, utf8_decode("Imp"), 1, "", "C", true);
        $pdf->cell(15, 8, utf8_decode("Estado"), 1, "", "C", true);

        $pdf->Ln();
        $pdf->SetTextColor(0, 0, 0);  // Establece el color del texto 
        $pdf->SetFillColor(255, 255, 255); // establece el color del fondo de la celda
        $pdf->SetFont("Arial", "", 8);

        foreach ($ingresos as $reg) {
            $pdf->cell(30, 8, utf8_decode($reg->fecha_hora), 1, "", "L", true);
            $pdf->cell(80, 8, utf8_decode($reg->nombre), 1, "", "L", true);
            $pdf->cell(55, 8, utf8_decode($reg->tipo_comprobante . ': ' . $reg->serie_comprobante . '-' . $reg->num_comprobante), 1, "", "L", true);
            $pdf->cell(10, 8, utf8_decode($reg->impuesto), 1, "", "C", true);
            $pdf->cell(15, 8, utf8_decode($reg->estado), 1, "", "C", true);
            $pdf->Ln();
        }

        $pdf->Output();
        exit;
    }
}