<?php

namespace App\Imports;

use App\Models\Letter;
use App\Models\RatificationLetter;
use App\Models\Document;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Storage;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Facades\DB;

class LettersImport implements ToCollection
{
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function collection(Collection $rows)
    {
        $privateDisk = Storage::disk('private');
        $importDisk = Storage::disk('importExcel');

        foreach ($rows as $index => $row) {
            if ($index === 0) {
                continue;
            }

            $finalPath = $index === 1 ? 'letters/' : 'ratification-letters/';
            $document = $this->storePdf($privateDisk, $importDisk, $row, $finalPath);

            if ($document) {
                if ($index === 1) {
                    $letter = Letter::create([
                        'title'            => $row[1],
                        'publication_date' => $this->transformDate($row[2]),
                        'open_until'       => $this->transformDate($row[3]),
                        'letter_type'      => 'newContracts',
                        'document_id'      => $document->id,
                        'user_id'          => null
                    ]);
                } else {
                    DB::table('ratification_letters')->insert([
                        'title'             => $row[1],
                        'status'            => 'approved',
                        'letter_id'         => $letter->id,
                        'document_id'       => $document->id,
                        'created_at'        => $this->transformDate($row[4]),
                        'status_updated_at' => $this->transformDate($row[5]),
                        'updated_at'        => now(),
                    ]);
                }
            }
        }
    }

    protected function storePdf($privateDisk, $importDisk, $row, $finalPath) {
        $tempFileName = $row[0];
        $ext = pathinfo($row[0], PATHINFO_EXTENSION);
        $uniqueName = md5($row[0]) . microtime(true);
        $newFileName = $uniqueName . '.' . $ext;

        $finalPath .= $newFileName;


        if (!$privateDisk->exists(dirname($finalPath))) {
            $privateDisk->makeDirectory(dirname($finalPath));
        }

        if ($tempFileName) {
            if ($importDisk->exists($tempFileName)) {
                $copied = $privateDisk->put($finalPath, $importDisk->get($tempFileName));
                if ($copied) {
                    $fileSize = $privateDisk->size($finalPath);

                    $document = Document::create([
                        'filename'              => $newFileName,
                        'original_filename'     => $tempFileName,
                        'extension'             => $ext,
                        'size'                  => $fileSize,
                    ]);

                    return $document;
                }
            } else {
               return null;
            }
        }
    }

    protected function transformDate($value, $format = 'd-m-Y')
    {
        try {
            return Date::excelToDateTimeObject($value)->format($format);
        } catch (\Exception $e) {
            return null;
        }
    }
}
