<?php

namespace App\Exports;

use App\Models\Box;
use App\Models\Product;
use App\Models\ProductEarlyEnlistment;
use App\Models\ProductNewness;
use App\Models\Stowage;
use Exception;
use Maatwebsite\Excel\Concerns\FromCollection;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

class DownloadAllProductsExport implements FromCollection
{
    public $_heading;

    public function __construct() {
        $this->_heading = [];
    }

    public function styles(Worksheet $sheet): array
    {
        return [
            1 => ['font' => ['bold' => true]]
        ];
    }

    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {

        $products = (new Product())
        ->where('available', 1)
        ->with(['productType', 'productInventory', 'productEnlistment'])
        ->get();

        try {
            $headers = [
                'id',
                'serial',
                'imei_1',
                'imei_2',
                'wifi',
                'bluetooth',
                'numero_transporte',
                'tipo_producto',
                'novedad',
                'alistado_pistoleado',
                'estiba',
                'caja'
            ];

            $data_export = [];

            foreach ($products as $key => $product) {
                $data_item['id'] = $product->id;
                $data_item['serial'] = $product->serial . ' ';
    
                if($product->product_type_id != 1) {
                    $data_item['imei_1'] = $product->imei_1 . ' ';
                    $data_item['imei_2'] = $product->imei_2 . ' ';
                    $data_item['wifi'] = $product->wifi . ' ';
                    $data_item['bluetooth'] = $product->bluetooth . ' ';
                } else {
                    $data_item['imei_1'] = '--';
                    $data_item['imei_2'] = '--';
                    $data_item['wifi'] = '--';
                    $data_item['bluetooth'] = '--';
                }
                
                $data_item['numero_transporte'] = $product->number_order . ' ';
                $data_item['tipo_producto'] = $product->productType->name;
                $data_item['novedad'] = 'Sin novedad';
                $data_item['alistado_pistoleado'] = 'Sin alistar';

                $data_item['estiba'] = '--';
                $data_item['caja'] = '--';

                if(isset($product->productInventory)) {
                    $box = $product->productInventory->box;
                    $stowage = $product->productInventory->box->stowage;

                    $data_item['estiba'] = $stowage->stowage_number;
                    $data_item['caja'] = $box->box_number;
                }

                if(isset($product->productEnlistment)) {
                    $box = $product->productEnlistment->box;
                    $stowage = $product->productEnlistment->box->stowage;
    
                    
                    $data_item['estiba'] = $stowage->stowage_number;
                    $data_item['caja'] = $box->box_number;
                }
                

                array_push($data_export, $data_item);
            }

            $stowage_ids = (new Stowage())
            ->where('enlistment', 1)
            ->where('available', 1)
            ->where('status', 1)
            ->with(['productType'])
            ->with(['boxes'  => function ($query) {
                $query->where('available', 1);
            }])           
            ->pluck('id')
            ->toArray();

            $boxes_id = (new Box())
            ->select('id')
            ->whereIn('stowage_id', $stowage_ids)
            ->where('available', 1)
            ->pluck('id')
            ->toArray();

            $product_ids = (new ProductEarlyEnlistment())
            ->select('product_id')
            ->whereIn('box_id', $boxes_id)
            ->pluck('product_id')
            ->toArray();

            $products = (new Product())
            ->whereIn('id', $product_ids)
            ->with(['productType', 'productInventory', 'productEnlistment'])
            ->get();

            foreach ($products as $key => $product) {
                $data_item['id'] = $product->id;
                $data_item['serial'] = $product->serial . ' ';
    
                if($product->product_type_id != 1) {
                    $data_item['imei_1'] = $product->imei_1 . ' ';
                    $data_item['imei_2'] = $product->imei_2 . ' ';
                    $data_item['wifi'] = $product->wifi . ' ';
                    $data_item['bluetooth'] = $product->bluetooth . ' ';
                } else {
                    $data_item['imei_1'] = '--';
                    $data_item['imei_2'] = '--';
                    $data_item['wifi'] = '--';
                    $data_item['bluetooth'] = '--';
                }
                
                $data_item['numero_transporte'] = $product->number_order . ' ';
                $data_item['tipo_producto'] = $product->productType->name;
                $data_item['novedad'] = 'Sin novedad';
                $data_item['alistado_pistoleado'] = 'Alistado y pistoleado';


                $data_item['estiba'] = '--';
                $data_item['caja'] = '--';

                if(isset($product->productEnlistment)) {
                    $box = $product->productEnlistment->box;
                    $stowage = $product->productEnlistment->box->stowage;
    
                    $data_item['estiba'] = $stowage->stowage_number;
                    $data_item['caja'] = $box->box_number;
                }

                array_push($data_export, $data_item);
            }

            $newnesses = (new ProductNewness())
            ->with(['product', 'newnessType'])
            ->get();

            foreach ($newnesses as $key => $newness) {
                if(isset($newness->product)) {
                    $data_item['id'] = $newness->product->id;
                $data_item['serial'] = $newness->product->serial . ' ';
    
                if($newness->product->product_type_id != 1) {
                    $data_item['imei_1'] = $newness->product->imei_1 . ' ';
                    $data_item['imei_2'] = $newness->product->imei_2 . ' ';
                    $data_item['wifi'] = $newness->product->wifi . ' ';
                    $data_item['bluetooth'] = $newness->product->bluetooth . ' ';
                } else {
                    $data_item['imei_1'] = '--';
                    $data_item['imei_2'] = '--';
                    $data_item['wifi'] = '--';
                    $data_item['bluetooth'] = '--';
                }
                
                $data_item['numero_transporte'] = $newness->product->number_order . ' ';
                $data_item['tipo_producto'] = $newness->product->productType->name;
                $data_item['novedad'] = $newness->newnessType->name . ' - ' . $newness->description;
                $data_item['alistado_pistoleado'] = '--';

                $data_item['estiba'] = '--';
                $data_item['caja'] = '--';

                if(isset($newness->product->productInventory)) {
                    $box = $newness->product->productInventory->box;
                    $stowage = $newness->product->productInventory->box->stowage;

                    $data_item['estiba'] = $stowage->stowage_number;
                    $data_item['caja'] = $box->box_number;
                }

                array_push($data_export, $data_item);
                }
                
            }
    
            $temp_all_data = collect($data_export);
            $first_element = collect($temp_all_data->first());
            $this->_heading = $headers;
        } catch (Exception $exception) {
            dd($exception->getMessage(), array_merge([$this->_heading], $data_export));
        }
        
        // --- DEBUG: volcar data a CSV antes de devolver ---
        $debugPath = storage_path('logs/products_export_' . date('Y-m-d_His') . '.csv');
        $fh = fopen($debugPath, 'w');
        fputcsv($fh, $this->_heading);        // encabezados
        foreach ($data_export as $row) {
            fputcsv($fh, $row);
        }
        fclose($fh);
        \Log::info('DEBUG export volcado', ['path' => $debugPath, 'filas' => count($data_export)]);
        // --- FIN DEBUG ---
        

        return collect(array_merge([$this->_heading], $data_export));

    }
}