<?php

namespace App\Http\Controllers\Finance;

use App\Http\Controllers\Controller;
use App\Models\Barobill\BankTransaction as BarobillBankTransaction;
use App\Models\Barobill\BankTransactionOverride;
use App\Models\Barobill\CardTransaction as BarobillCardTransaction;
use App\Models\Finance\BankAccount;
use App\Services\BankAccountService;
use App\Services\FundScheduleService;
use Illuminate\Contracts\View\View;

class FinanceDashboardController extends Controller
{
    public function __construct(
        private BankAccountService $bankAccountService,
        private FundScheduleService $fundScheduleService
    ) {}

    /**
     * 재무 대시보드
     */
    public function index(): View
    {
        // 계좌 요약
        $accountSummary = $this->bankAccountService->getSummary();

        // 자금 일정 요약
        $scheduleSummary = $this->fundScheduleService->getSummary();

        // 이번 달 자금 일정 요약
        $monthlySummary = $this->fundScheduleService->getMonthlySummary(
            now()->year,
            now()->month
        );

        // 향후 7일 자금 일정
        $upcomingSchedules = $this->fundScheduleService->getUpcomingSchedules(7);

        // 최근 거래내역 (바로빌 - 최근 7일, 최대 10건)
        $tenantId = session('selected_tenant_id', 1);
        $weekAgo = now()->subDays(7)->format('Ymd');
        $today = now()->format('Ymd');

        $recentTransactions = BarobillBankTransaction::where('tenant_id', $tenantId)
            ->whereBetween('trans_date', [$weekAgo, $today])
            ->orderBy('trans_date', 'desc')
            ->orderBy('trans_time', 'desc')
            ->limit(10)
            ->get();

        // 오버라이드 데이터 병합 (수정된 적요/내용)
        if ($recentTransactions->isNotEmpty()) {
            $uniqueKeys = $recentTransactions->map(fn ($t) => $t->unique_key)->toArray();
            $overrides = BankTransactionOverride::getByUniqueKeys($tenantId, $uniqueKeys);

            $recentTransactions = $recentTransactions->map(function ($transaction) use ($overrides) {
                $override = $overrides->get($transaction->unique_key);
                if ($override) {
                    // 수정된 적요가 있으면 적용
                    if ($override->modified_summary) {
                        $transaction->summary = $override->modified_summary;
                    }
                    // 수정된 내용이 있으면 적용
                    if ($override->modified_cast) {
                        $transaction->cast = $override->modified_cast;
                    }
                    $transaction->is_overridden = true;
                } else {
                    $transaction->is_overridden = false;
                }

                return $transaction;
            });
        }

        // 최근 카드 사용내역 (바로빌 - 최근 7일, 최대 10건)
        $recentCardTransactions = BarobillCardTransaction::where('tenant_id', $tenantId)
            ->whereBetween('use_date', [$weekAgo, $today])
            ->orderBy('use_date', 'desc')
            ->orderBy('use_time', 'desc')
            ->limit(10)
            ->get();

        // 계좌별 잔액
        $accountBalances = BankAccount::active()
            ->ordered()
            ->get(['id', 'bank_name', 'account_number', 'account_name', 'balance', 'account_type']);

        return view('finance.dashboard', compact(
            'accountSummary',
            'scheduleSummary',
            'monthlySummary',
            'upcomingSchedules',
            'recentTransactions',
            'recentCardTransactions',
            'accountBalances'
        ));
    }
}
