<?php

namespace App\Http\Controllers\Barobill;

use App\Http\Controllers\Controller;
use App\Models\Barobill\BarobillMember;
use App\Models\Finance\TradingPartner;
use App\Models\Tenants\Tenant;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\View\View;

/**
 * 바로빌 컨트롤러
 */
class BarobillController extends Controller
{
    /**
     * 바로빌 설정 페이지
     * HTMX 요청 시 전체 페이지 리로드 (스크립트 로딩을 위해)
     */
    public function config(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('barobill.config.index'));
        }

        // 현재 선택된 테넌트 정보
        $tenantId = session('selected_tenant_id');
        $currentTenant = $tenantId ? Tenant::find($tenantId) : null;

        // 해당 테넌트의 바로빌 회원사 정보
        $barobillMember = $tenantId
            ? BarobillMember::where('tenant_id', $tenantId)->first()
            : null;

        return view('barobill.config.index', compact('currentTenant', 'barobillMember'));
    }

    /**
     * 회원사관리 페이지
     * HTMX 요청 시 전체 페이지 리로드 (스크립트 로딩을 위해)
     */
    public function members(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('barobill.members.index'));
        }

        // 테넌트 목록 (전체 테넌트 모드에서 선택용)
        $tenants = Tenant::select('id', 'company_name')->orderBy('company_name')->get();

        return view('barobill.members.index', compact('tenants'));
    }

    /**
     * 바로빌 설정 페이지 (이메일 주소 및 기타 자료 수정/동기화)
     */
    public function settings(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('barobill.settings.index'));
        }

        // 현재 선택된 테넌트 정보
        $tenantId = session('selected_tenant_id', 1);
        $currentTenant = Tenant::find($tenantId);

        // 해당 테넌트의 바로빌 회원사 정보
        $barobillMember = BarobillMember::where('tenant_id', $tenantId)->first();

        // 서버 모드 판별
        $isTestMode = $barobillMember ? $barobillMember->isTestMode() : true;

        // 바로빌 로그인 정보 등록 여부
        $hasBarobillLogin = false;
        if ($barobillMember) {
            try {
                $hasBarobillLogin = ! empty($barobillMember->barobill_id) && ! empty($barobillMember->barobill_pwd);
            } catch (\Throwable $e) {
                $hasBarobillLogin = ! empty($barobillMember->barobill_id) && ! empty($barobillMember->getRawOriginal('barobill_pwd'));
            }
        }

        return view('barobill.settings.index', compact('currentTenant', 'barobillMember', 'isTestMode', 'hasBarobillLogin'));
    }

    /**
     * 전자세금계산서 페이지
     */
    public function taxInvoice(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('barobill.tax-invoice.index'));
        }

        return view('barobill.tax-invoice.index');
    }

    /**
     * 계좌조회 페이지
     */
    public function bankAccount(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('barobill.bank-account.index'));
        }

        $tenantId = session('selected_tenant_id', 1);
        $currentTenant = Tenant::find($tenantId);
        $barobillMember = BarobillMember::where('tenant_id', $tenantId)->first();
        $isTestMode = $barobillMember ? $barobillMember->isTestMode() : true;

        return view('barobill.bank-account.index', compact('currentTenant', 'barobillMember', 'isTestMode'));
    }

    /**
     * 카드사용내역 페이지
     */
    public function cardUsage(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('barobill.card-usage.index'));
        }

        $tenantId = session('selected_tenant_id', 1);
        $currentTenant = Tenant::find($tenantId);
        $barobillMember = BarobillMember::where('tenant_id', $tenantId)->first();
        $isTestMode = $barobillMember ? $barobillMember->isTestMode() : true;

        return view('barobill.card-usage.index', compact('currentTenant', 'barobillMember', 'isTestMode'));
    }

    /**
     * 홈텍스매입/매출 페이지
     */
    public function hometax(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('barobill.hometax.index'));
        }

        return view('barobill.hometax.index');
    }

    /**
     * 사용량조회 페이지
     */
    public function usage(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('barobill.usage.index'));
        }

        // 현재 선택된 테넌트 정보
        $tenantId = session('selected_tenant_id', 1);
        $currentTenant = Tenant::find($tenantId);

        // 해당 테넌트의 바로빌 회원사 정보
        $barobillMember = BarobillMember::where('tenant_id', $tenantId)->first();

        // 본사(테넌트 1) 여부
        $isHeadquarters = $tenantId == 1;

        return view('barobill.usage.index', compact('currentTenant', 'barobillMember', 'isHeadquarters'));
    }

    /**
     * 거래처 검색 (전자세금계산서 공급받는자 검색용)
     */
    public function searchTradingPartners(Request $request): JsonResponse
    {
        $tenantId = session('selected_tenant_id', 1);
        $keyword = $request->input('keyword', '');

        $query = TradingPartner::forTenant($tenantId)->active();

        if ($keyword) {
            $query->where(function ($q) use ($keyword) {
                $q->where('name', 'like', "%{$keyword}%")
                    ->orWhere('biz_no', 'like', "%{$keyword}%")
                    ->orWhere('manager', 'like', "%{$keyword}%");
            });
        }

        $partners = $query->orderBy('name')
            ->limit(50)
            ->get(['id', 'name', 'biz_no', 'ceo', 'address', 'type', 'category', 'contact', 'email', 'manager', 'manager_phone']);

        return response()->json($partners);
    }

    /**
     * 과금관리 페이지 (본사 전용)
     */
    public function billing(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('barobill.billing.index'));
        }

        // 현재 선택된 테넌트 정보
        $tenantId = session('selected_tenant_id', 1);
        $currentTenant = Tenant::find($tenantId);

        // 본사(테넌트 1) 여부
        $isHeadquarters = $tenantId == 1;

        // 테넌트 목록 (전체 테넌트 모드에서 선택용)
        $tenants = Tenant::select('id', 'company_name')->orderBy('company_name')->get();

        return view('barobill.billing.index', compact('currentTenant', 'isHeadquarters', 'tenants'));
    }
}
