<?php

namespace App\Services;

use App\Models\HR\Employee;
use App\Models\Tenants\Tenant;
use App\Models\Tenants\TenantSetting;
use Illuminate\Support\Facades\Log;

class ResignationService
{
    private ?string $koreanFontName = null;

    public function __construct()
    {
        if (! defined('K_PATH_FONTS')) {
            $tcpdfFontsDir = dirname(__DIR__, 2).'/storage/fonts/tcpdf/';
            if (is_dir($tcpdfFontsDir)) {
                define('K_PATH_FONTS', $tcpdfFontsDir);
            }
        }
    }

    /**
     * 사원의 사직서 정보 조회
     */
    public function getCertInfo(int $userId, int $tenantId): array
    {
        $employee = Employee::withoutGlobalScopes()
            ->where('tenant_id', $tenantId)
            ->where('user_id', $userId)
            ->with(['user', 'department'])
            ->firstOrFail();

        $tenant = Tenant::findOrFail($tenantId);

        $displaySetting = TenantSetting::withoutGlobalScopes()
            ->where('tenant_id', $tenantId)
            ->where('setting_group', 'company')
            ->where('setting_key', 'display_company_name')
            ->first();
        $displayName = $displaySetting?->setting_value ?? '';
        $companyName = ! empty($displayName) ? $displayName : ($tenant->company_name ?? '');

        $residentNumber = $employee->resident_number ?? '';

        return [
            'name' => $employee->user->name ?? $employee->display_name ?? '',
            'resident_number' => $residentNumber,
            'department' => $employee->department?->name ?? '',
            'position' => $employee->position_label ?? '',
            'hire_date' => $employee->hire_date ?? '',
            'address' => $employee->address ?? '',
            'company_name' => $companyName,
            'ceo_name' => $tenant->ceo_name ?? '',
        ];
    }

    /**
     * content JSON 기반 PDF Response 생성
     */
    public function generatePdfResponse(array $content): \Illuminate\Http\Response
    {
        $pdf = new \TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
        $pdf->SetCreator('SAM');
        $pdf->SetAuthor($content['company_name'] ?? 'SAM');
        $pdf->SetTitle('사직서');

        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);
        $pdf->SetMargins(20, 40, 20);
        $pdf->SetAutoPageBreak(true, 20);

        $font = $this->getKoreanFont();

        $pdf->AddPage();

        // 상단 여백
        $pdf->Ln(20);

        // 제목
        $pdf->SetFont($font, 'B', 24);
        $pdf->Cell(0, 20, '사 직 서', 0, 1, 'C');
        $pdf->Ln(20);

        // 테이블
        $this->addTableRow($pdf, $font, [
            ['소 속', $content['department'] ?? '-', 40],
            ['직 위', $content['position'] ?? '-', 40],
        ]);
        $this->addTableRow($pdf, $font, [
            ['성 명', $content['name'] ?? '-', 40],
            ['주민등록번호', $content['resident_number'] ?? '-', 40],
        ]);
        $this->addTableRow($pdf, $font, [
            ['입사일', $content['hire_date'] ?? '-', 40],
            ['퇴사(예정)일', $content['resign_date'] ?? '-', 40],
        ]);
        $this->addTableRow($pdf, $font, [
            ['주 소', $content['address'] ?? '-', 0],
        ]);
        $this->addTableRow($pdf, $font, [
            ['사 유', $content['reason'] ?? '-', 0],
        ]);
        $pdf->Ln(30);

        // 증명 문구
        $pdf->SetFont($font, '', 14);
        $pdf->MultiCell(0, 10, '상기 본인은 위 사유로 인하여 사직하고자'."\n".'이에 사직서를 제출하오니 허가하여 주시기 바랍니다.', 0, 'C');
        $pdf->Ln(20);

        // 날짜
        $issueDate = $content['issue_date'] ?? date('Y-m-d');
        $issueDateFormatted = $this->formatDate($issueDate);
        $pdf->SetFont($font, 'B', 14);
        $pdf->Cell(0, 12, $issueDateFormatted, 0, 1, 'C');
        $pdf->Ln(10);

        // 신청인
        $pdf->SetFont($font, '', 14);
        $pdf->Cell(0, 12, '신청인    '.($content['name'] ?? '').'    (인)', 0, 1, 'C');
        $pdf->Ln(30);

        // 회사명 + 대표이사 귀하
        $ceoName = $content['ceo_name'] ?? '';
        $pdf->SetFont($font, 'B', 16);
        $pdf->Cell(0, 12, ($content['company_name'] ?? '').'    대표이사 귀하', 0, 1, 'C');

        $pdfContent = $pdf->Output('', 'S');
        $fileName = '사직서_'.($content['name'] ?? '').'.pdf';

        return response($pdfContent, 200, [
            'Content-Type' => 'application/pdf',
            'Content-Disposition' => 'inline; filename="'.$fileName.'"',
        ]);
    }

    private function addTableRow(\TCPDF $pdf, string $font, array $cells): void
    {
        $pageWidth = $pdf->getPageWidth() - 40;
        $rowHeight = 12;
        $thWidth = 30;

        if (count($cells) === 1) {
            $pdf->SetFont($font, 'B', 12);
            $pdf->SetFillColor(248, 249, 250);
            $pdf->Cell($thWidth, $rowHeight, $cells[0][0], 1, 0, 'L', true);
            $pdf->SetFont($font, '', 12);
            $pdf->Cell($pageWidth - $thWidth, $rowHeight, $cells[0][1], 1, 1, 'L');
        } else {
            $tdWidth = ($pageWidth - $thWidth * 2) / 2;
            foreach ($cells as $cell) {
                $pdf->SetFont($font, 'B', 12);
                $pdf->SetFillColor(248, 249, 250);
                $pdf->Cell($thWidth, $rowHeight, $cell[0], 1, 0, 'L', true);
                $pdf->SetFont($font, '', 12);
                $pdf->Cell($tdWidth, $rowHeight, $cell[1], 1, 0, 'L');
            }
            $pdf->Ln();
        }
    }

    private function formatDate(string $date): string
    {
        try {
            return date('Y년 m월 d일', strtotime($date));
        } catch (\Throwable) {
            return $date;
        }
    }

    private function getKoreanFont(): string
    {
        if ($this->koreanFontName) {
            return $this->koreanFontName;
        }

        if (defined('K_PATH_FONTS') && file_exists(K_PATH_FONTS.'pretendard.php')) {
            $this->koreanFontName = 'pretendard';

            return $this->koreanFontName;
        }

        $fontPath = storage_path('fonts/Pretendard-Regular.ttf');
        if (file_exists($fontPath)) {
            try {
                $this->koreanFontName = \TCPDF_FONTS::addTTFfont($fontPath, 'TrueTypeUnicode', '', 96);
            } catch (\Throwable $e) {
                Log::warning('TCPDF 한글 폰트 등록 실패', ['error' => $e->getMessage()]);
            }
        }

        return $this->koreanFontName ?: 'helvetica';
    }
}
