<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\ShippingRate;
use App\ShippingSpecialPrefecture;
use App\ShippingRemoteIsland;
use App\ShippingSetting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Arr;

class ShippingRateController extends Controller
{
    // 送料設定の取得
    public function index()
    {
        $rates = ShippingRate::orderBy('price_from', 'desc')->get();
        $specialPrefectureIds = ShippingSpecialPrefecture::pluck('prefecture_id')->toArray();
        $prefectures = DB::table('prefectures')->orderBy('id')->get();
        $remoteIslandEnabled = ShippingSetting::where('key', 'remote_island_enabled')->value('value') === '1';

        return response()->json([
            'rates' => $rates,
            'special_prefecture_ids' => $specialPrefectureIds,
            'prefectures' => $prefectures,
            'remote_island_enabled' => $remoteIslandEnabled,
        ]);
    }

    // 送料設定の保存
    public function update(Request $request)
    {
        $params = $request->all();

        // Update rates
        if (isset($params['rates']) && is_array($params['rates'])) {
            ShippingRate::query()->delete();
            foreach ($params['rates'] as $index => $rate) {
                ShippingRate::create([
                    'price_from' => (int) $rate['price_from'],
                    'normal_cost' => (int) $rate['normal_cost'],
                    'special_cost' => (int) $rate['special_cost'],
                    'position' => $index + 1,
                ]);
            }
        }

        // Update special prefectures
        if (isset($params['special_prefecture_ids']) && is_array($params['special_prefecture_ids'])) {
            ShippingSpecialPrefecture::query()->delete();
            foreach ($params['special_prefecture_ids'] as $prefId) {
                ShippingSpecialPrefecture::create(['prefecture_id' => (int) $prefId]);
            }
        }

        // Update remote island setting
        if (isset($params['remote_island_enabled'])) {
            ShippingSetting::updateOrCreate(
                ['key' => 'remote_island_enabled'],
                ['value' => $params['remote_island_enabled'] ? '1' : '0']
            );
        }

        return response()->json(['status' => 'success']);
    }

    // 離島一覧
    public function islandIndex(Request $request)
    {
        $keyword = $request->get('keyword', '');
        $query = ShippingRemoteIsland::orderBy('postal_code');
        if (!empty($keyword)) {
            $query->where(function ($q) use ($keyword) {
                $q->where('postal_code', 'LIKE', "%{$keyword}%")
                  ->orWhere('prefecture', 'LIKE', "%{$keyword}%")
                  ->orWhere('city', 'LIKE', "%{$keyword}%")
                  ->orWhere('area', 'LIKE', "%{$keyword}%");
            });
        }
        return response()->json($query->paginate($request->get('limit', 50)));
    }

    // 離島追加
    public function islandStore(Request $request)
    {
        $request->validate([
            'postal_code' => 'required|string|size:7',
        ]);

        $island = ShippingRemoteIsland::create($request->only(['postal_code', 'prefecture', 'city', 'area']));
        return response()->json(['status' => 'success', 'data' => $island]);
    }

    // 離島削除
    public function islandDestroy($id)
    {
        ShippingRemoteIsland::where('id', $id)->delete();
        return response()->json(null, 204);
    }

    // 離島CSV一括インポート
    public function islandImport(Request $request)
    {
        $request->validate(['file' => 'required|file|mimes:csv,txt']);

        $file = $request->file('file');
        $handle = fopen($file->getRealPath(), 'r');
        $count = 0;

        // Skip BOM
        $bom = fread($handle, 3);
        if ($bom !== "\xEF\xBB\xBF") {
            rewind($handle);
        }

        // Skip header row
        fgetcsv($handle);

        while (($row = fgetcsv($handle)) !== false) {
            if (empty($row[0])) continue;
            $postalCode = preg_replace('/[^0-9]/', '', $row[0]);
            if (strlen($postalCode) !== 7) continue;

            ShippingRemoteIsland::updateOrCreate(
                ['postal_code' => $postalCode],
                [
                    'prefecture' => $row[1] ?? '',
                    'city' => $row[2] ?? '',
                    'area' => $row[3] ?? '',
                ]
            );
            $count++;
        }
        fclose($handle);

        return response()->json(['status' => 'success', 'count' => $count]);
    }

    // 離島全削除
    public function islandClear()
    {
        $count = ShippingRemoteIsland::count();
        ShippingRemoteIsland::query()->delete();
        return response()->json(['status' => 'success', 'count' => $count]);
    }
}
