<?php
/**
 * Server-side validation (mirror booking-form-validation.ts).
 *
 * @package DatvetaucaotocBooking
 */

declare(strict_types=1);

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

final class Datvetau_Booking_Validator {

	public static function validate_booking_payload( array $payload ): array {
		$errors = array();

		$trip_type = (string) ( $payload['tripType'] ?? '' );
		if ( ! in_array( $trip_type, array( 'one-way', 'round-trip' ), true ) ) {
			$errors[] = 'Loại vé không hợp lệ';
		}

		$seat_class = (string) ( $payload['seatClass'] ?? '' );
		if ( ! in_array( $seat_class, array( 'eco', 'vip' ), true ) ) {
			$errors[] = 'Hạng ghế không hợp lệ';
		}

		$out_id = (int) ( $payload['outboundTripId'] ?? 0 );
		if ( $out_id <= 0 ) {
			$errors[] = 'Chưa chọn chuyến chiều đi';
		}

		if ( 'round-trip' === $trip_type && empty( $payload['inboundTripId'] ) ) {
			$errors[] = 'Chưa chọn chuyến chiều về';
		}

		$booker = (array) ( $payload['booker'] ?? array() );
		if ( empty( trim( (string) ( $booker['fullName'] ?? '' ) ) ) ) {
			$errors[] = 'Vui lòng nhập tên người đặt vé';
		}
		if ( empty( trim( (string) ( $booker['phone'] ?? '' ) ) ) ) {
			$errors[] = 'Vui lòng nhập số điện thoại/Zalo';
		}

		$passengers = (array) ( $payload['passengers'] ?? array() );
		if ( count( $passengers ) < 1 ) {
			$errors[] = 'Cần ít nhất một hành khách';
		}

		$out_trip = $out_id ? Datvetau_Booking_Trip_Repository::find_by_id( $out_id ) : null;
		$trip_ref = $out_trip ? Datvetau_Booking_Pricing::parse_display_date( gmdate( 'd-m-Y', strtotime( (string) $out_trip['trip_date'] ) ) ) : null;

		foreach ( $passengers as $i => $p ) {
			$p = (array) $p;
			if ( empty( trim( (string) ( $p['fullName'] ?? '' ) ) ) ) {
				$errors[] = 'Hành khách ' . ( $i + 1 ) . ': thiếu họ tên';
			}
			$birth = (string) ( $p['birthDate'] ?? '' );
			if ( ! Datvetau_Booking_Pricing::parse_display_date( $birth ) ) {
				$errors[] = 'Hành khách ' . ( $i + 1 ) . ': ngày sinh không hợp lệ';
			} elseif ( $trip_ref ) {
				$b = Datvetau_Booking_Pricing::parse_display_date( $birth );
				if ( $b && $b > $trip_ref ) {
					$errors[] = 'Hành khách ' . ( $i + 1 ) . ': ngày sinh phải trước ngày đi tàu';
				}
			}
			if ( empty( trim( (string) ( $p['idNumber'] ?? '' ) ) ) ) {
				$errors[] = 'Hành khách ' . ( $i + 1 ) . ': thiếu CCCD';
			}
			if ( empty( trim( (string) ( $p['nationality'] ?? '' ) ) ) ) {
				$errors[] = 'Hành khách ' . ( $i + 1 ) . ': thiếu quốc tịch';
			}
			if ( empty( trim( (string) ( $p['hometown'] ?? '' ) ) ) ) {
				$errors[] = 'Hành khách ' . ( $i + 1 ) . ': thiếu quê quán';
			}
		}

		return $errors;
	}
}
