<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;

use App\Http\Requests\ProductAddEdit;
use App\Models\{Product,ProductTranslate};

class ProductController extends Controller
{
	/**
	 * Get a list of products that meet a type
	 *
	 * @param Request $request
	 * @return Collection
	 * @throws \Exception
	 */
	public function api_supplied_products(Request $request): Collection
	{
		switch ($request->type) {
			case Product\Broadband::class:
				return Product\Broadband::select(['id','supplier_item_id'])
					->with(['supplied.supplier_detail.supplier'])
					->get()
					->map(fn($item)=>['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier->name,$item->supplied->name)])
					->sortBy('name')
					->values();

			case Product\Domain::class:
				return Product\Domain::select(['id','supplier_item_id'])
					->with(['supplied.supplier_detail.supplier'])
					->get()
					->map(fn($item)=>['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier->name,$item->supplied->name)])
					->sortBy('name')
					->values();

			case Product\Email::class:
				return Product\Email::select(['id','supplier_item_id'])
					->with(['supplied.supplier_detail.supplier'])
					->get()
					->map(fn($item)=>['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier->name,$item->supplied->name)])
					->sortBy('name')
					->values();

			case Product\Generic::class:
				return Product\Generic::select(['id','supplier_item_id'])
					->with(['supplied.supplier_detail.supplier'])
					->get()
					->map(fn($item)=>['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier->name,$item->supplied->name)])
					->sortBy('name')
					->values();

			case Product\Host::class:
				return Product\Host::select(['id','supplier_item_id'])
					->with(['supplied.supplier_detail.supplier'])
					->get()
					->map(fn($item)=>['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier->name,$item->supplied->name)])
					->sortBy('name')
					->values();

			case Product\Phone::class:
				return Product\Phone::select(['id','supplier_item_id'])
					->with(['supplied.supplier_detail.supplier'])
					->get()
					->map(fn($item)=>['id'=>$item->id,'name'=>sprintf('%s: %s',$item->supplied->supplier->name,$item->supplied->name)])
					->sortBy('name')
					->values();

			default:
				throw new \Exception('Unknown type: '.$request->type);
		}
	}

	public function addedit(ProductAddEdit $request,Product $o)
	{
		foreach (Arr::except($request->validated(),['translate','accounting','pricing','active']) as $key => $item)
			$o->{$key} = $item;

		$o->active = (bool)$request->active;

		// Trim down the pricing array, remove null values
		$o->pricing = collect($request->validated('pricing'))
			->map(function($item) {
				foreach ($item as $k=>$v) {
					if (is_array($v)) {
						$v = array_filter($v);
						$item[$k] = $v;
					}
				}

				return $item;
			});

		try {
			$o->save();

		} catch (\Exception $e) {
			return redirect()
				->back()
				->withErrors($e->getMessage())
				->withInput();
		}

		$o->load(['translate']);
		$oo = $o->translate ?: new ProductTranslate;
		foreach ($request->validated('translate',[]) as $key => $item)
			$oo->{$key} = $item;

		$o->translate()->save($oo);

		foreach ($request->validated('accounting',[]) as $k=>$v) {
			$o->providers()->syncWithoutDetaching([
				$k => [
					'ref' => $v,
					'site_id'=>$o->site_id,
				],
			]);
		}

		return redirect()
			->back()
			->with('success','Product saved');
	}
}