<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Coin;

class CoinController extends Controller
{
    public function index(Request $request)
    {
        $perPage = $request->get('per_page', 10);
        $search = $request->get('search', '');

        $query = Coin::query();

        if ($search) {
            $query->where('name', 'like', "%{$search}%");
        }

        $coins = $query->orderBy('id', 'desc')->paginate($perPage);

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

    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|string|max:255|unique:coins,name',
            'simbolo' => 'required|string|max:10',
            'codigo' => 'required|string|max:10',
        ], [
            'name.required' => 'El nombre es obligatorio.',
            'name.string' => 'El nombre debe ser una cadena de texto.',
            'name.max' => 'El nombre no debe exceder los 255 caracteres.',
            'name.unique' => 'El nombre ya está registrado.',
            'simbolo.required' => 'El símbolo es obligatorio.',
            'simbolo.string' => 'El símbolo debe ser una cadena de texto.',
            'simbolo.max' => 'El símbolo no debe exceder los 10 caracteres.',
            'codigo.required' => 'El código es obligatorio.',
            'codigo.string' => 'El código debe ser una cadena de texto.',
            'codigo.max' => 'El código no debe exceder los 10 caracteres.',
        ]);

        $coin = Coin::create($validatedData);

        return response()->json([
            'success' => true,
            'message' => 'Moneda creada exitosamente',
            'data' => $coin
        ], 201);
    }

    public function update(Request $request, $id)
    {
        $coin = Coin::findOrFail($id);

        $validatedData = $request->validate([
            'name' => 'required|string|max:255|unique:coins,name,' . $coin->id,
            'simbolo' => 'required|string|max:10',
            'codigo' => 'required|string|max:10',
        ], [
            'name.required' => 'El nombre es obligatorio.',
            'name.string' => 'El nombre debe ser una cadena de texto.',
            'name.max' => 'El nombre no debe exceder los 255 caracteres.',
            'name.unique' => 'El nombre ya está registrado.',
            'simbolo.required' => 'El símbolo es obligatorio.',
            'simbolo.string' => 'El símbolo debe ser una cadena de texto.',
            'simbolo.max' => 'El símbolo no debe exceder los 10 caracteres.',
            'codigo.required' => 'El código es obligatorio.',
            'codigo.string' => 'El código debe ser una cadena de texto.',
            'codigo.max' => 'El código no debe exceder los 10 caracteres.',
        ]);

        $coin->update($validatedData);

        return response()->json([
            'success' => true,
            'message' => 'Moneda actualizada exitosamente',
            'data' => $coin
        ]);
    }

    public function destroy($id)
    {
        $coin = Coin::findOrFail($id);
        $coin->delete();

        return response()->json([
            'success' => true,
            'message' => 'Moneda eliminada exitosamente'
        ]);
    }

    public function show($id)
    {
        $coin = Coin::findOrFail($id);

        return response()->json([
            'success' => true,
            'data' => $coin
        ]);
    }
}
