<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Carrier;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\View\View;

class CarrierController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index(): View
    {
        $carriers = Carrier::latest()->get();
        return view('admin.carriers.index', compact('carriers'));
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create(): View
    {
        return view('admin.carriers.create');
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request): RedirectResponse
    {
        $data = $request->validate([
            'name' => 'required|string|max:255',
            'slug' => 'nullable|string|max:255|unique:carriers,slug',
            'enabled' => 'nullable|boolean',
            'process_type' => 'required|in:automatic,manual',
            'api_keys' => 'nullable|string',
            'config_schema' => 'nullable|string',
        ]);

        // Generate slug if not provided
        if (empty($data['slug'])) {
            $data['slug'] = Str::slug($data['name']);
        }

        if (($data['process_type'] ?? 'automatic') === Carrier::PROCESS_TYPE_AUTOMATIC) {
            $request->validate(['api_keys' => 'required|string']);
        }

        $apiKeys = [];
        if (!empty($data['api_keys'])) {
            $apiKeys = json_decode($data['api_keys'], true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                return redirect()->back()
                    ->withInput()
                    ->withErrors(['api_keys' => 'Invalid JSON format for API keys.']);
            }
        }

        $configSchema = null;
        if (!empty($data['config_schema'])) {
            $configSchema = json_decode($data['config_schema'], true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                return redirect()->back()
                    ->withInput()
                    ->withErrors(['config_schema' => 'Invalid JSON format for config schema.']);
            }
        }

        $carrier = new Carrier();
        $carrier->name = $data['name'];
        $carrier->slug = $data['slug'];
        $carrier->enabled = $request->has('enabled');
        $carrier->process_type = $data['process_type'];
        if ($carrier->process_type === Carrier::PROCESS_TYPE_AUTOMATIC && !empty($apiKeys)) {
            $carrier->setApiKeys($apiKeys);
        } else {
            $carrier->setApiKeys([]);
        }
        $carrier->config_schema = $configSchema;
        $carrier->save();

        return redirect()->route('admin.carriers.index')
            ->with('success', 'Carrier created successfully!');
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(Carrier $carrier): View
    {
        // Decrypt API keys for editing
        $apiKeys = $carrier->getDecryptedApiKeys();
        return view('admin.carriers.edit', compact('carrier', 'apiKeys'));
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, Carrier $carrier): RedirectResponse
    {
        $data = $request->validate([
            'name' => 'required|string|max:255',
            'slug' => 'required|string|max:255|unique:carriers,slug,' . $carrier->id,
            'enabled' => 'nullable|boolean',
            'process_type' => 'required|in:automatic,manual',
            'api_keys' => 'nullable|string',
            'config_schema' => 'nullable|string',
        ]);

        if (($data['process_type'] ?? 'automatic') === Carrier::PROCESS_TYPE_AUTOMATIC) {
            $request->validate(['api_keys' => 'required|string']);
        }

        $apiKeys = [];
        if (!empty($data['api_keys'])) {
            $apiKeys = json_decode($data['api_keys'], true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                return redirect()->back()
                    ->withInput()
                    ->withErrors(['api_keys' => 'Invalid JSON format for API keys.']);
            }
        }

        $configSchema = null;
        if (!empty($data['config_schema'])) {
            $configSchema = json_decode($data['config_schema'], true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                return redirect()->back()
                    ->withInput()
                    ->withErrors(['config_schema' => 'Invalid JSON format for config schema.']);
            }
        }

        $carrier->name = $data['name'];
        $carrier->slug = $data['slug'];
        $carrier->enabled = $request->has('enabled');
        $carrier->process_type = $data['process_type'];
        if ($carrier->process_type === Carrier::PROCESS_TYPE_AUTOMATIC && !empty($apiKeys)) {
            $carrier->setApiKeys($apiKeys);
        }
        $carrier->config_schema = $configSchema;
        $carrier->save();

        return redirect()->route('admin.carriers.index')
            ->with('success', 'Carrier updated successfully!');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Carrier $carrier): RedirectResponse
    {
        // Check if carrier has shipments
        if ($carrier->shipments()->count() > 0) {
            return redirect()->route('admin.carriers.index')
                ->with('error', 'Cannot delete carrier with existing shipments.');
        }

        $carrier->delete();

        return redirect()->route('admin.carriers.index')
            ->with('success', 'Carrier deleted successfully!');
    }
}
