<?php

namespace App\Http\Controllers;

use App\Models\Restaurante;
use App\Models\CanalVenta;
use App\Models\Sector;
use App\Models\TipoCanal;
use App\Services\UuidService;
use App\Services\PaginatorService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
use Ramsey\Uuid\Uuid;

class CanalesVentaController extends Controller {

  /**
   * Obtiene de forma paginada los canales de venta 
   */
  public function all(Request $request, $restaurante_id) {
    app(UuidService::class)->validOrFail($restaurante_id);
    $restaurante = Restaurante::findOrFail($restaurante_id);

    $canalesVenta = $restaurante->canalesVenta();

    $paginate = app(PaginatorService::class)->paginate(
      perPage: $request->input('per_page', 15),
      page: $request->input('page', 1),
      total: $canalesVenta->count(),
      route: 'canales-venta.all',
      data: ['restaurante_id' => $restaurante_id],
    );

    $data = $canalesVenta->get()
                         ->skip($paginate['from'] - 1)
                         ->take($paginate['per_page'])
                         ->all();

    return response()->json([
      'pagination' => $paginate,
      'data' => $data
    ]);
  }

  /**
   * Obtiene un canal de venta por su id
   */
  public function get(Request $request, $restaurante_id, $id) {
    app(UuidService::class)->validOrFail($id);
    app(UuidService::class)->validOrFail($restaurante_id);

    $restaurante = Restaurante::findOrFail($restaurante_id);
    $canalVenta = CanalVenta::findOrFail($id);

    if($canalVenta->restaurante != $restaurante) {
      throw new ModelNotFoundException("canal_venta", $id);
    }

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

  /**
   * Crea un nuevo canal de venta
   */
  public function create(Request $request, $restaurante_id) {
    $this->validate($request, [
      'nombre' => 'required',
      'sector_id' => 'required|exists:sectores,id',
      'tipo_canal_id' => 'required|exists:tipos_canal,id'
    ]);

    app(UuidService::class)->validOrFail($restaurante_id);
    app(UuidService::class)->validOrFail($request->input('sector_id'));
    app(UuidService::class)->validOrFail($request->input('tipo_canal_id'));

    $restaurante = Restaurante::findOrFail($restaurante_id);
    $sector = Sector::findOrFail($request->input('sector_id'));
    $tipo_canal = TipoCanal::findOrFail($request->input('tipo_canal_id'));

    if($sector->restaurante != $restaurante) {
      throw new ModelNotFoundException("sector", $id);
    }

    $canalVenta = CanalVenta::create([
      'id' => Uuid::uuid4(),
      'nombre' => $request->input('nombre'),
      'sector_id' => $sector->id,
      'tipo_canal_id' => $tipo_canal->id,
      'restaurante_id' => $restaurante_id
    ]);

    return response()->json($canalVenta, 201);
  }

  /**
   * Actualiza un canal de venta
   */
  public function update(Request $request, $restaurante_id, $id) {
    $this->validate($request, [
      'nombre' => 'required',
      'sector_id' => 'required|exists:sectores,id',
      'tipo_canal_id' => 'required|exists:tipos_canal,id'
    ]);

    app(UuidService::class)->validOrFail($restaurante_id);
    app(UuidService::class)->validOrFail($request->input('sector_id'));
    app(UuidService::class)->validOrFail($request->input('tipo_canal_id'));
    app(UuidService::class)->validOrFail($id);

    $restaurante = Restaurante::findOrFail($restaurante_id);
    $sector = Sector::findOrFail($request->input('sector_id'));
    $tipo_canal = TipoCanal::findOrFail($request->input('tipo_canal_id'));
    $canalVenta = CanalVenta::findOrFail($id);

    if($sector->restaurante != $restaurante) {
      throw new ModelNotFoundException("sector", $id);
    }

    if($canalVenta->restaurante != $restaurante) {
      throw new ModelNotFoundException("canal_venta", $id);
    }

    $canalVenta->nombre = $request->input('nombre');
    $canalVenta->sector_id = $request->input('sector_id');
    $canalVenta->tipo_canal_id = $request->input('tipo_canal_id');
    $canalVenta->save();

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

  /**
   * Elimina un canal de venta
   */
  public function delete(Request $request, $restaurante_id, $id) {
    app(UuidService::class)->validOrFail($restaurante_id);
    app(UuidService::class)->validOrFail($id);

    $restaurante = Restaurante::findOrFail($restaurante_id);
    $canalVenta = CanalVenta::findOrFail($id);

    if($canalVenta->restaurante != $restaurante) {
      throw new ModelNotFoundException("canal_venta", $id);
    }

    $canalVenta->delete();

    return response()->json([], 204);
  }
}
