<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Illuminate\Http\Request;


use App\Order;
use App\Invoice;
use App\Customer;

class InvoiceController extends Controller
{
	public function search(Request $request)
	{
		$formdata = [
			'InvoiceDateFrom' => $request->input('InvoiceDateFrom', null),
			'InvoiceDateTo' => $request->input('InvoiceDateTo', null),
			'BillingDestinationCode' => $request->input('BillingDestinationCode', null),
		];
		$this->OperationLog([],['formdata' => $formdata]);
		logger('Invoice.search', ['formdata' => $formdata]);

		$query = Invoice::query();
		$query->selectRaw("invoices.id");
		$query->selectRaw("invoices.attributes");
		$query->selectRaw("invoices.details");

		$InvoiceDateColumn = "CAST(invoices.attributes->'$.\"当月請求\".\"請求日\"' AS DATE)";
		if ($formdata['InvoiceDateFrom'])
		{
			$query->whereRaw("'{$formdata['InvoiceDateFrom']}' <= {$InvoiceDateColumn}");
		}
		if ($formdata['InvoiceDateTo'])
		{
			$query->whereRaw(" {$InvoiceDateColumn} <= '{$formdata['InvoiceDateTo']}'");
		}
		$query->leftJoin('customers', 'BillingCustomerCode', '=', 'customers.code');
		if ($formdata['BillingDestinationCode'])
		{
			$query->whereRaw("customers.code LIKE '%{$formdata['BillingDestinationCode']}%'");
		}
		$query->selectRaw("customers.name as customer_name");
		$query->orderBy("customers.code");
		$query->orderByRaw($InvoiceDateColumn);

		logger('Invoice.search', ['sql' => $query->toSql()]);

		$invoices = $query->get();
		logger('Invoice.search', ['invoices' => $invoices,]);

		$resp = [
			'invoices' => $invoices,
		];
		return response()->json($resp);
	}


	public function update(Request $request)
	{
		$resp = 0;
		$formdata = [
			'action' => $request->input('action', null),
			'derivery_id' => $request->input('derivery_id', null),
			'orders' => $request->input('orders', []),
			'attributes' => $request->input('attributes', null),
		];
		$this->OperationLog([],['formdata' => $formdata]);

		logger('Delivery.update', ['formdata' => $formdata]);
		//logger('Delivery.update', ['formdata[base_papers]' => $formdata['base_papers']]);

		if (empty($formdata['attributes']['DeliveryNumber'])) {
			// 新規納品書は 納品番号を付番
			$formdata['attributes']['DeliveryNumber'] = Delivery::GetNewDeliveryNumber();
		}

		//logger('Order', ['formdata' => $formdata]);

		$fields = [
			'orders' => json_encode($formdata['orders']),
			'attributes' => json_encode($formdata['attributes']),
		];
		//logger('Order', ['fields' => $fields]);

		$deliveryModel = Delivery::query();
		//logger('Order', ['__LINE__' => __LINE__]);
		if ($formdata['action'] == 'update') {
			$id = $formdata['derivery_id'];
			$deliveryModel->updateOrInsert(['id' => $formdata['derivery_id']],$fields);
		} else {
			logger('Delivery.update', ['__LINE__' => __LINE__]);
			$id = $deliveryModel->insertGetId($fields);
			logger('Delivery.update', ['__LINE__' => __LINE__]);
		}

		$resp = [
			'id' => $id,
		];
		return response()->json($resp);
	}
	
	// 単票 帳票出力
	// view
	//   report01 : 請求書
	public function report01()
	{
		$formdata = [
			'invoice_id' => request('invoice_id'),
			'view' => request('view','report01'),
		];
		$version = [
		];
		$this->OperationLog($version,['formdata' => $formdata]);
		logger('Invoice.report01', [
			'formdata' => $formdata,
		]);
		
		$query = Invoice::query();
		$query->where('deleted', null);
		$query->where('id',$formdata['invoice_id']);
		$invoice = $query->first();

		logger('Invoice.report01', ['sql' => $query->toSql()]);

		// 請求先を取得
		$query = Customer::query();
		$query->where('code',$invoice['attributes']['請求得意先']);
		$customer = $query->first();
		$customer['attributes'] = json_decode($customer['attributes'],true);

		// 詳細を受注日と連番でソート
		$detailArray = $invoice['details'];
		usort($detailArray, function ($left, $right)
		{
			if ($left['OrderDate'] != $right['OrderDate']) return ($left['OrderDate'] > $right['OrderDate']) ? 1 : -1;
			if ($left['OrderNumber'] != $right['OrderNumber']) return ($left['OrderNumber'] - $right['OrderNumber']);
			if ($left['Number'] != $right['Number']) return ($left['Number'] - $right['Number']);
			return 0;
		});
		$invoice['details'] = $detailArray;

		$viewdata = [
			'customer' => $customer,
			'invoice' => $invoice,
		];
		logger('Invoice.report01', ['viewdata' => $viewdata]);

		return view("invoice." . $formdata['view'], compact('viewdata'));
	}

	// 一覧 帳票出力
	// view
	//   report02 : 請求書
	public function report02()
	{
		$formdata = [
			'billing_destination_code' => request('billing_destination_code'),
			'start_date' => request('start_date'),
			'end_date' => request('end_date'),
			'view' => request('view','report02'),
		];
		$version = [
		];
		$this->OperationLog($version,['formdata' => $formdata]);
		logger('Invoice.report02', [
			'formdata' => $formdata,
		]);

		$query = Invoice::query();
		$query->selectRaw("invoices.id");
		$query->selectRaw("invoices.attributes");
		//$query->selectRaw("invoices.details");

		$InvoiceDateColumn = "CAST(invoices.attributes->'$.\"当月請求\".\"請求日\"' AS DATE)";
		if ($formdata['start_date'])
		{
			$query->whereRaw("'{$formdata['start_date']}' <= {$InvoiceDateColumn}");
		}
		if ($formdata['end_date'])
		{
			$query->whereRaw(" {$InvoiceDateColumn} <= '{$formdata['end_date']}'");
		}
		$query->leftJoin('customers', 'BillingCustomerCode', '=', 'customers.code');
		$query->selectRaw("customers.name as customer_name");
		$query->selectRaw("customers.code as customer_code");
		if ($formdata['billing_destination_code'])
		{
			$query->whereRaw("customers.code LIKE '%{$formdata['billing_destination_code']}%'");
		}
		$query->orderBy("customers.code");

		logger('Invoice.search02', ['sql' => $query->toSql()]);

		$invoices = $query->get();
		//logger('Invoice.search02', ['invoices' => $invoices,]);

		$viewdata = [
			'invoices' => $invoices,
			'formdata' => $formdata,
		];
		//logger('Invoice.report', ['viewdata' => $viewdata]);

		return view("invoice." . $formdata['view'], compact('viewdata'));
	}

}
