<?php

namespace Modules\Internal\Http\Controllers\Api;

use App\Models\Formularium;
use App\Services\ImportService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Helpers\Helper;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\FormulariumService;

use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;


class FormulariumController extends Controller
{
    /**
     * Display a listing of the resource.
     * @return Renderable
     */
    public function __construct(FormulariumService $formulariumService)
    {
        $this->formulariumService = $formulariumService;
    }
    public function index(Request $request, $id)
    {
        if ($request->search) {
            return Formularium::when($request->search ?? null, function ($formularium) use ($request, $id) {
                $formularium->where('formularium_template_id', $id)
                    ->where('name', 'LIKE', '%' . $request->search . '%')
                    ->orWhere('code', 'LIKE', '%' . $request->search . '%');
            })->paginate(15);
        }
         else {
            $formulariums = Formularium::query()
                                // ->filter($request->toArray())
                                ->where('formularium_template_id', $id)
                                ->orderBy('name', 'ASC')
                                ->paginate(15);
            return $formulariums;
        }
        return $formulariums;
    }

    /**
     * Show the form for creating a new resource.
     * @return Renderable
     */
    public function create()
    {
        return view('internal::create');
    }

    /**
     * Store a newly created resource in storage.
     * @param Request $request
     * @return Renderable
     */
    public function store(Request $request, $id)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'file' => 'optional|file|mimes:xlsx,xls',
        ]);

        $formularium = Formularium::create($request->all());

        return $formularium;
    }

    /**
     * Show the specified resource.
     * @param int $id
     * @return Renderable
     */
    public function show($id)
    {
        return view('internal::show');
    }

    /**
     * Show the form for editing the specified resource.
     * @param int $id
     * @return Renderable
     */
    public function edit($id)
    {
        return view('internal::edit');
    }

    /**
     * Update the specified resource in storage.
     * @param Request $request
     * @param int $id
     * @return Renderable
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     * @param int $id
     * @return Renderable
     */
    public function destroy($id)
    {
        //
    }

    public function import(Request $request, $id) 
    {
        $request->validate([
            'file' => 'required|file|mimes:xls,xlsx,csv,txt',
        ]);
        // dd($request->toArray());
        $file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
        $file = $request->file('file')->storeAs('temp', $file_name);
        
        // $importLog = $corporate->importLogs()->create([
        //     'type' => 'diagnosis-exclusions',
        //     'file_path' => $file,
        //     'status' => 'pending',
        //     'progress' => 0,
        // ]);

        $import = new ImportService();
        $import->read(Storage::path('temp/'.$file_name));
        $import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
        foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
            $doc_headers_indexes = [];
            foreach ($sheet->getRowIterator() as $index => $row) {
                if ($index == 1) { // First Row Must be Header
                    foreach ($row->getCells() as $index => $cell) {
                        $title = $cell->getValue();
                        $title = preg_replace( "/\r|\n/", " ", $title );
                        $title = preg_replace('/\xc2\xa0/', " ", $title );
                        $title = rtrim($title);
                        $title = ltrim($title);
                        $doc_headers_indexes[$index] = $title;
                    }

                    // Write Header to File
                    $result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
                    $import->addArrayToRow($result_headers);

                    // TODO Validate if First Row not Header
                } else { // Next Row Should be Data
                    $row_data = [];
                    $row_map = [
                        0 => 'code',
                        1 => 'name',
                        2 => 'description',
                        3 => 'manufacturer',
                        4 => 'category_name',
                        5 => 'kategori_obat',
                        6 => 'uom',
                        7 => 'general_indication',
                        8 => 'composition',
                        9 => 'atc_code',
                        10 => 'class',
                        11 => 'bpom_registration',
                        12 => 'classifications',
                        13 => 'cat_for',
                    ];
                    
                    foreach ($row->getCells() as $header_index => $cell) {
                        if (isset($row_map[$header_index])) {
                            $value = $cell->getValue();
                            $value = preg_replace( "/\r|\n/", " ", $value );
                            $value = preg_replace('/\xc2\xa0/', " ", $value );
                            $value = rtrim($value);
                            $value = ltrim($value);
                            $row_data[$row_map[$header_index]] = $cell->getValue();
                        }
                    }

                    try { // Process the Row Data
                        if (
                            // empty($row_data['code']) &&
                            // empty($row_data['description']) &&
                            empty($row_data['code']) &&
                            empty($row_data['name']) &&
                            empty($row_data['description']) &&
                            empty($row_data['manufacturer']) &&
                            empty($row_data['category_name']) &&
                            empty($row_data['kategori_obat']) &&
                            empty($row_data['uom']) &&
                            empty($row_data['general_indication']) &&
                            empty($row_data['composition']) &&
                            empty($row_data['atc_code']) &&
                            empty($row_data['class']) &&
                            empty($row_data['bpom_registration']) &&
                            empty($row_data['classifications']) &&
                            empty($row_data['cat_for']) 
                            ) {
                            continue;
                        }

                        // Save the Row
                        $formulariumService = new FormulariumService();
                        $formulariumService->handleFormuariumTemplateRow($row_data, $id);

                        // Write Success Result to File
                        $import->addArrayToRow(array_merge($row_data, [
                            'Ingest Code' => 200,
                            'Ingest Note' => 'Success',
                        ]), $sheet->getName());

                    } catch (ImportRowException $e) {
                        // Write Data Validation Error to File
                        $import->addArrayToRow(array_merge($row_data, [
                            'Ingest Code' => $e->getCode(),
                            'Ingest Note' => $e->getMessage(),
                        ]), $sheet->getName());
                    } catch (\Exception $e) {
                        throw new \Exception($e);
                        // Write Server Error to File
                        $import->addArrayToRow(array_merge($row_data, [
                            'Ingest Code' => 500,
                            'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
                        ]), $sheet->getName());
                    }
                }
            }

            break; // Only Read First Row
        }
        $import->reader->close();
        Storage::delete('temp/'.$file_name);
        $import->writer->close();

        return [
            // 'total_successed_row' => $imported_plan_data,
            // 'total_failed_row' => count($failed_plan_data),
            // 'failed_row' => $failed_plan_data,
            'result_file' => [
                'url' => Storage::disk('public')->url('temp/result-'.$file_name),
                'name' => 'result-'.$file_name,
            ]
        ];
    }

    public function generateFormulariumList(Request $request)
    {
        // Mendapatkan data yang akan diekspor (misalnya, dari database)
        $data = Formularium::get()->toArray();

        // Membuat penulis entitas Spout
        $writer = WriterEntityFactory::createXLSXWriter();
        
        // Membuka penulis untuk menulis ke file
        $writer->openToFile(public_path('files/TemplateFormulariumList.xlsx'));
        /** Create a style with the StyleBuilder */
        $style = (new StyleBuilder())
            ->setFontBold()
            ->build();
        
        // Menulis header kolom
        $headers_map_to_table_fields = $this->formulariumService->listing_doc_headers;
        $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
              
        $writer->addRow($headerRow);
      
        // Menulis data
        if (!empty($data)) {
            foreach ($data as $item) {
                $rowData = [
                    $item['code'],           // code
                    $item['name'],       // name
                    $item['description'],          // Description
                    $item['manufacturer'],   // manufacturer
                    $item['category_name'],          // category_name
                    $item['kategori_obat'],   // kategori_obat
                    $item['uom'],   // uom
                    $item['general_indication'],   // Description
                    $item['composition'],   // composition
                    $item['atc_code'],   // atc_code
                    $item['class'],   // class
                    $item['bpom_registration'],   // bpom_registration
                    $item['classifications'],   // classifications
                    $item['cat_for'],   // cat_for
                  
                ];
        
                $row = WriterEntityFactory::createRowFromArray($rowData);
                $writer->addRow($row);
            }
        }
        
        // Menutup penulis
        $writer->close();
        
        // Mengembalikan response untuk mengunduh file
        $filePath = public_path('files/TemplateFormulariumList.xlsx');
        
        return Helper::responseJson([
            'file_name' => "Formularium List " . date('Y-m-d h:i:s'),
            "file_url" => url('files/TemplateFormulariumList.xlsx')
        ]);
        
    }
}
