<?php

namespace App\Mail;

use App\Order;
use App\Laravue\Models\User;
use App\Mail\Traits\UsesEmailTemplate;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class ProvisionalOrderCancelled extends Mailable implements ShouldQueue
{
	use Queueable, SerializesModels, UsesEmailTemplate;

	public $user;
	public $order;
	public $reason;

	public function __construct(User $user, Order $order, string $reason)
	{
		$this->user = $user;
		$this->order = $order;
		$this->reason = $reason;
		$this->onConnection(config('queue.default'));
		$this->onQueue(config('queue.connections.redis.queue'));

		$orderDetailHtml = $this->buildOrderDetailHtml($order, $reason);

		$this->loadTemplate('u_provisional_cancelled', [
			'full_name'    => $user->full_name ?? $user->name,
			'first_name'   => $user->first_name,
			'last_name'    => $user->last_name,
			'email'        => $user->email,
			'order_code'   => $order->code,
			'total_price'  => number_format($order->total_price ?? 0),
			'reason'       => e($reason),
			'order_detail' => $orderDetailHtml,
		]);
	}

	public function build()
	{
		return $this->buildFromTemplate();
	}

	protected function buildOrderDetailHtml(Order $order, string $reason): string
	{
		$createdAt = $order->created_at ? Carbon::parse($order->created_at)->format('Y年m月d日 H:i') : '-';

		$html = '<table style="border-collapse: collapse; width: 100%; max-width: 500px;">'
			. '<tbody>'
			. '<tr style="background-color: #f2f2f2;"><th style="border: 1px solid #ddd; padding: 12px; width: 40%;">注文番号</th><td style="border: 1px solid #ddd; padding: 12px;">#' . $order->code . '</td></tr>'
			. '<tr><th style="border: 1px solid #ddd; padding: 12px;">注文日時</th><td style="border: 1px solid #ddd; padding: 12px;">' . $createdAt . '</td></tr>'
			. '<tr style="background-color: #f2f2f2;"><th style="border: 1px solid #ddd; padding: 12px;">合計金額</th><td style="border: 1px solid #ddd; padding: 12px;">¥' . number_format($order->total_price ?? 0) . '</td></tr>'
			. '<tr style="background-color: #ffeeba;"><th style="border: 1px solid #ddd; padding: 12px;">キャンセル理由</th><td style="border: 1px solid #ddd; padding: 12px; color: #856404;">' . e($reason) . '</td></tr>'
			. '</tbody></table>';

		$orderDetails = $order->order_detail ?? collect();
		if ($orderDetails->isNotEmpty()) {
			$html .= '<br/><br/><strong>【キャンセルされた商品】</strong><br/>'
				. '<table style="border-collapse: collapse; width: 100%; max-width: 600px; margin-top: 10px;">'
				. '<thead><tr style="background-color: #f2f2f2;">'
				. '<th style="border: 1px solid #ddd; padding: 8px;">商品名</th>'
				. '<th style="border: 1px solid #ddd; padding: 8px; width: 100px;">価格</th>'
				. '</tr></thead><tbody>';

			foreach ($orderDetails as $detail) {
				$html .= '<tr>'
					. '<td style="border: 1px solid #ddd; padding: 8px;">' . e($detail->product_name ?? '') . '</td>'
					. '<td style="border: 1px solid #ddd; padding: 8px; text-align: right;">¥' . number_format($detail->price ?? 0) . '</td>'
					. '</tr>';
			}

			$html .= '</tbody></table>';
		}

		return $html;
	}
}
