<?php

namespace App\Console\Commands;

use App\Periksa;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;

class ExportRegisterApiByDateCommand extends Command
{
    protected $signature = 'register-api:export
        {date : Tanggal data periksa, format YYYY-MM-DD}
        {--column=daftar : Kolom tanggal untuk filter, contoh daftar/tanggalregis/tanggalsampel}
        {--output= : Simpan hasil JSON ke file}
        {--pretty : Format JSON agar mudah dibaca}';

    protected $description = 'Export data periksa per tanggal ke format JSON payload registerApi.';

    public function handle(): int
    {
        $date = $this->argument('date');
        $column = (string) $this->option('column');

        if (!$this->isValidDate($date)) {
            $this->error('Format tanggal harus YYYY-MM-DD.');
            return Command::FAILURE;
        }

        if (!in_array($column, ['daftar', 'tanggalregis', 'tanggalsampel'], true)) {
            $this->error('Kolom tanggal hanya boleh: daftar, tanggalregis, tanggalsampel.');
            return Command::FAILURE;
        }

        $records = Periksa::with('getPasien')
            ->whereDate($column, $date)
            ->orderBy($column)
            ->orderBy('id')
            ->get()
            ->map(fn (Periksa $periksa) => $this->mapPeriksaToRegisterPayload($periksa))
            ->values();

        $payload = [
            'tanggal' => $date,
            'filter_column' => $column,
            'total' => $records->count(),
            'data' => $records,
        ];

        $jsonOptions = JSON_UNESCAPED_SLASHES;
        if ($this->option('pretty')) {
            $jsonOptions |= JSON_PRETTY_PRINT;
        }

        $json = json_encode($payload, $jsonOptions);
        if ($json === false) {
            $this->error('Gagal membuat JSON.');
            return Command::FAILURE;
        }

        if ($this->option('output')) {
            $output = (string) $this->option('output');
            File::ensureDirectoryExists(dirname($output));
            File::put($output, $json . PHP_EOL);
            $this->info('Export selesai: ' . $output);
            $this->info('Total data: ' . $records->count());
            return Command::SUCCESS;
        }

        $this->line($json);

        return Command::SUCCESS;
    }

    private function mapPeriksaToRegisterPayload(Periksa $periksa): array
    {
        $pasien = $periksa->getPasien;
        $tanggalLahir = $this->formatDate($periksa->tgllahirpasien ?? $pasien?->tgl_lahir);
        $tanggalRegis = $this->formatDate($periksa->tanggalregis) ?: $this->formatDate($periksa->daftar);
        $tanggalSampel = $this->formatDate($periksa->tanggalsampel) ?: $tanggalRegis;
        $diagnosa = $periksa->klinis ?: null;
        $klinisi = $periksa->klinisi ?: null;

        return [
            'norm' => $periksa->noregister,
            'nama' => $periksa->nmpasien,
            'alamat' => $periksa->alamatpasien ?: config('global.addressapps'),
            'kota' => $pasien?->kota ?: config('global.subdomainapps'),
            'tgllahir' => $tanggalLahir ?: date('Y-m-d'),
            'nohap' => $periksa->tlppasien ?: '0000000000',
            'kelamin' => $periksa->jkpasien ?: 'L',
            'urgensi' => $periksa->urgensi ?: 'Elective',
            'beratbadan' => (string) ($periksa->berat ?? '0'),
            'nik' => $periksa->ktp ?: '0',
            'nobpjs' => $periksa->bpjs ?: '0',
            'drpeminta' => $klinisi,
            'asalpasien' => $periksa->asalpasien,
            'diagnosa' => $diagnosa,
            'statusbayar' => null,
            'nomor_lab' => $periksa->orderid,
            'jenispembayaran' => $periksa->asuransi ?: 'UMM',
            'klinisi' => $klinisi,
            'jenispemeriksaan' => $periksa->reques,
            'spesimen' => $periksa->nm_spesimen,
            'kodespesimen' => $periksa->kd_spesimen,
            'pengambilan' => $periksa->pengambilan,
            'keteranganrujukan' => $periksa->nmrs ?: 'RSSA Malang',
            'namarspengirim' => $periksa->nmrs ?: 'RSSA Malang',
            'tanggalregis' => $tanggalRegis ?: date('Y-m-d'),
            'tanggalsampel' => $tanggalSampel ?: date('Y-m-d'),
            'asalpengirim' => $periksa->asalpengirim,
        ];
    }

    private function isValidDate(string $date): bool
    {
        try {
            $parsed = Carbon::createFromFormat('Y-m-d', $date);
        } catch (\Throwable) {
            return false;
        }

        return $parsed && $parsed->format('Y-m-d') === $date;
    }

    private function formatDate(mixed $value): ?string
    {
        if (!$value) {
            return null;
        }

        try {
            return Carbon::parse($value)->format('Y-m-d');
        } catch (\Throwable) {
            return null;
        }
    }
}
