<?php
/**
 * WP Admin menus and screens.
 *
 * @package DatvetaucaotocBooking
 */

declare(strict_types=1);

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

final class Datvetau_Booking_Admin {

	public static function register(): void {
		add_action( 'admin_menu', array( self::class, 'menu' ) );
		add_action( 'admin_init', array( self::class, 'handle_post' ) );
		add_action( 'admin_enqueue_scripts', array( self::class, 'enqueue_assets' ) );
		add_filter( 'admin_body_class', array( self::class, 'admin_body_class' ) );
	}

	public static function admin_body_class( string $classes ): string {
		$page = isset( $_GET['page'] ) ? (string) wp_unslash( $_GET['page'] ) : '';
		if ( '' !== $page && str_contains( $page, 'datvetau-booking' ) ) {
			$classes .= ' datvetau-booking-admin';
		}
		return $classes;
	}

	public static function enqueue_assets( string $hook ): void {
		if ( ! str_contains( $hook, 'datvetau-booking' ) ) {
			return;
		}
		wp_enqueue_style(
			'datvetau-booking-admin',
			DATVETAU_BOOKING_URL . 'assets/css/admin-booking.css',
			array(),
			defined( 'DATVETAU_BOOKING_VERSION' ) ? DATVETAU_BOOKING_VERSION : '1.0.0'
		);
		wp_enqueue_media();
		wp_enqueue_script(
			'datvetau-booking-admin-media',
			DATVETAU_BOOKING_URL . 'assets/js/admin-media.js',
			array( 'jquery' ),
			defined( 'DATVETAU_BOOKING_VERSION' ) ? DATVETAU_BOOKING_VERSION : '1.0.0',
			true
		);
	}

	public static function menu(): void {
		add_menu_page(
			__( 'Đặt vé tàu', 'datvetaucaotoc-booking' ),
			__( 'Đặt vé tàu', 'datvetaucaotoc-booking' ),
			'manage_options',
			'datvetau-booking',
			array( self::class, 'page_bookings' ),
			'dashicons-tickets-alt',
			58
		);

		add_submenu_page( 'datvetau-booking', __( 'Đơn đặt vé', 'datvetaucaotoc-booking' ), __( 'Đơn đặt vé', 'datvetaucaotoc-booking' ), 'manage_options', 'datvetau-booking', array( self::class, 'page_bookings' ) );
		add_submenu_page( 'datvetau-booking', __( 'Tuyến', 'datvetaucaotoc-booking' ), __( 'Tuyến', 'datvetaucaotoc-booking' ), 'manage_options', 'datvetau-booking-routes', array( self::class, 'page_routes' ) );
		add_submenu_page( 'datvetau-booking', __( 'Chuyến', 'datvetaucaotoc-booking' ), __( 'Chuyến', 'datvetaucaotoc-booking' ), 'manage_options', 'datvetau-booking-trips', array( self::class, 'page_trips' ) );
		add_submenu_page( 'datvetau-booking', __( 'Import lịch tháng', 'datvetaucaotoc-booking' ), __( 'Import lịch tháng', 'datvetaucaotoc-booking' ), 'manage_options', 'datvetau-booking-import', array( self::class, 'page_import' ) );
		add_submenu_page( 'datvetau-booking', __( 'Cài đặt', 'datvetaucaotoc-booking' ), __( 'Cài đặt', 'datvetaucaotoc-booking' ), 'manage_options', 'datvetau-booking-settings', array( self::class, 'page_settings' ) );
	}

	public static function handle_post(): void {
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}

		if ( isset( $_GET['page'] ) && 'datvetau-booking-import' === $_GET['page'] && isset( $_GET['download_sample'] ) ) {
			check_admin_referer( 'datvetau_import_sample' );
			require_once DATVETAU_BOOKING_DIR . 'includes/lib/class-datvetau-xlsx-writer.php';
			$bytes = Datvetau_Booking_Xlsx_Writer::build( Datvetau_Booking_Trip_Importer::sample_table_rows() );
			if ( '' === $bytes ) {
				wp_die( esc_html__( 'Khong tao duoc file mau Excel.', 'datvetaucaotoc-booking' ) );
			}
			nocache_headers();
			header( 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' );
			header( 'Content-Disposition: attachment; filename="mau-import-lich.xlsx"' );
			header( 'Content-Length: ' . (string) strlen( $bytes ) );
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			echo $bytes;
			exit;
		}

		if ( isset( $_POST['datvetau_route_save'] ) && check_admin_referer( 'datvetau_route_save' ) ) {
			$id = ! empty( $_POST['route_id'] ) ? (int) $_POST['route_id'] : null;
			Datvetau_Booking_Route_Repository::save(
				array(
					'slug'             => (string) wp_unslash( $_POST['slug'] ?? '' ),
					'label'            => (string) wp_unslash( $_POST['label'] ?? '' ),
					'reverse_route_id' => (int) ( $_POST['reverse_route_id'] ?? 0 ),
					'sort_order'       => (int) ( $_POST['sort_order'] ?? 0 ),
					'is_active'        => ! empty( $_POST['is_active'] ),
				),
				$id
			);
			wp_safe_redirect( admin_url( 'admin.php?page=datvetau-booking-routes&saved=1' ) );
			exit;
		}

		if ( isset( $_GET['datvetau_delete_route'] ) && check_admin_referer( 'datvetau_delete_route_' . (int) $_GET['datvetau_delete_route'] ) ) {
			Datvetau_Booking_Route_Repository::delete( (int) $_GET['datvetau_delete_route'] );
			wp_safe_redirect( admin_url( 'admin.php?page=datvetau-booking-routes&deleted=1' ) );
			exit;
		}

		if ( isset( $_POST['datvetau_trip_save'] ) && check_admin_referer( 'datvetau_trip_save' ) ) {
			$id = ! empty( $_POST['trip_id'] ) ? (int) $_POST['trip_id'] : null;
			$trip_date_raw = (string) wp_unslash( $_POST['trip_date'] ?? '' );
			$trip_date     = Datvetau_Booking_Admin_Format::date_to_storage( $trip_date_raw );
			if ( ! $trip_date ) {
				wp_die( esc_html__( 'Ngày chuyến không hợp lệ.', 'datvetaucaotoc-booking' ) );
			}
			Datvetau_Booking_Trip_Repository::save(
				array(
					'route_id'             => (int) ( $_POST['route_id'] ?? 0 ),
					'trip_date'            => $trip_date,
					'departure_time'       => (string) wp_unslash( $_POST['departure_time'] ?? '' ),
					'arrival_time'         => (string) wp_unslash( $_POST['arrival_time'] ?? '' ),
					'operator_name'        => (string) wp_unslash( $_POST['operator_name'] ?? '' ),
					'operator_logo_url'    => esc_url_raw( (string) wp_unslash( $_POST['operator_logo_url'] ?? '' ) ),
					'seat_class'           => (string) wp_unslash( $_POST['seat_class'] ?? 'eco' ),
					'price_adult'          => (int) ( $_POST['price_adult'] ?? 0 ),
					'price_child'          => (int) ( $_POST['price_child'] ?? 0 ),
					'price_senior'         => (int) ( $_POST['price_senior'] ?? 0 ),
					'capacity'             => (int) ( $_POST['capacity'] ?? 0 ),
					'seats_remaining'      => (int) ( $_POST['seats_remaining'] ?? 0 ),
					'status'               => (string) wp_unslash( $_POST['status'] ?? 'active' ),
				),
				$id
			);
			wp_safe_redirect( admin_url( 'admin.php?page=datvetau-booking-trips&saved=1' ) );
			exit;
		}

		if ( isset( $_GET['datvetau_delete_trip'] ) && check_admin_referer( 'datvetau_delete_trip_' . (int) $_GET['datvetau_delete_trip'] ) ) {
			Datvetau_Booking_Trip_Repository::delete( (int) $_GET['datvetau_delete_trip'] );
			wp_safe_redirect( self::trips_admin_url( array( 'deleted' => '1' ) ) );
			exit;
		}

		if ( isset( $_POST['datvetau_trips_bulk_delete'] ) && check_admin_referer( 'datvetau_trips_bulk_delete' ) ) {
			$ids     = isset( $_POST['trip_ids'] ) && is_array( $_POST['trip_ids'] )
				? wp_unslash( $_POST['trip_ids'] )
				: array();
			$removed = Datvetau_Booking_Trip_Repository::delete_many( $ids );
			wp_safe_redirect(
				self::trips_admin_url(
					array(
						'bulk_deleted' => (string) $removed,
					),
					array(
						'redirect_route_id' => (string) wp_unslash( $_POST['redirect_route_id'] ?? '' ),
						'redirect_month'    => (string) wp_unslash( $_POST['redirect_month'] ?? '' ),
					)
				)
			);
			exit;
		}

		if ( isset( $_POST['datvetau_import_schedule'] ) && check_admin_referer( 'datvetau_import_schedule' ) ) {
			$mode   = (string) wp_unslash( $_POST['on_duplicate'] ?? 'update' );
			$file   = isset( $_FILES['import_file'] ) && is_array( $_FILES['import_file'] ) ? $_FILES['import_file'] : null;
			$result = Datvetau_Booking_Trip_Importer::import_uploaded_file( $file, $mode );
			set_transient( 'datvetau_import_result', $result, 60 );
			wp_safe_redirect( admin_url( 'admin.php?page=datvetau-booking-import&done=1' ) );
			exit;
		}

		if ( isset( $_POST['datvetau_settings_save'] ) && check_admin_referer( 'datvetau_settings_save' ) ) {
			$banks_in = isset( $_POST['banks'] ) && is_array( $_POST['banks'] ) ? wp_unslash( $_POST['banks'] ) : array();
			$banks    = array();
			foreach ( $banks_in as $row ) {
				if ( ! is_array( $row ) ) {
					continue;
				}
				$banks[] = array(
					'id'             => sanitize_key( (string) ( $row['id'] ?? '' ) ),
					'account_number' => sanitize_text_field( (string) ( $row['account_number'] ?? '' ) ),
					'bank_name'      => sanitize_text_field( (string) ( $row['bank_name'] ?? '' ) ),
					'qr_image_url'   => esc_url_raw( (string) ( $row['qr_image_url'] ?? '' ) ),
					'qr_alt'         => sanitize_text_field( (string) ( $row['qr_alt'] ?? '' ) ),
					'qr_note'        => sanitize_text_field( (string) ( $row['qr_note'] ?? '' ) ),
				);
			}
			Datvetau_Booking_Settings::update(
				array(
					'method_label'          => sanitize_text_field( (string) wp_unslash( $_POST['method_label'] ?? '' ) ),
					'info_title'            => sanitize_text_field( (string) wp_unslash( $_POST['info_title'] ?? '' ) ),
					'direct_pay_lead'       => sanitize_text_field( (string) wp_unslash( $_POST['direct_pay_lead'] ?? '' ) ),
					'direct_pay_address'    => sanitize_textarea_field( (string) wp_unslash( $_POST['direct_pay_address'] ?? '' ) ),
					'transfer_lead'         => sanitize_textarea_field( (string) wp_unslash( $_POST['transfer_lead'] ?? '' ) ),
					'screenshot_note'       => sanitize_textarea_field( (string) wp_unslash( $_POST['screenshot_note'] ?? '' ) ),
					'policy_title'          => sanitize_text_field( (string) wp_unslash( $_POST['policy_title'] ?? '' ) ),
					'policy_link_href'      => sanitize_text_field( (string) wp_unslash( $_POST['policy_link_href'] ?? '' ) ),
					'policy_link_label'     => sanitize_text_field( (string) wp_unslash( $_POST['policy_link_label'] ?? '' ) ),
					'default_operator_logo' => esc_url_raw( (string) wp_unslash( $_POST['default_operator_logo'] ?? '' ) ),
					'booking_notify_enabled'  => ! empty( $_POST['booking_notify_enabled'] ),
					'booking_notify_to'       => sanitize_text_field( (string) wp_unslash( $_POST['booking_notify_to'] ?? '' ) ),
					'booking_notify_subject'  => sanitize_text_field( (string) wp_unslash( $_POST['booking_notify_subject'] ?? '' ) ),
					'banks'                 => $banks ?: Datvetau_Booking_Settings::defaults()['banks'],
				)
			);
			wp_safe_redirect( admin_url( 'admin.php?page=datvetau-booking-settings&saved=1' ) );
			exit;
		}

		if ( isset( $_POST['datvetau_booking_status_save'] ) ) {
			$booking_id = (int) ( $_POST['booking_id'] ?? 0 );
			if ( $booking_id && check_admin_referer( 'datvetau_booking_status_' . $booking_id ) ) {
				$new_status = sanitize_key( (string) wp_unslash( $_POST['status'] ?? '' ) );
				if ( 'cancelled' === $new_status ) {
					Datvetau_Booking_Service::cancel_booking( $booking_id );
				} elseif ( in_array( $new_status, array( 'pending_payment', 'confirmed' ), true ) ) {
					Datvetau_Booking_Booking_Repository::update_status( $booking_id, $new_status );
				}
				wp_safe_redirect( admin_url( 'admin.php?page=datvetau-booking&booking_id=' . $booking_id . '&updated=1' ) );
				exit;
			}
		}

		if ( isset( $_GET['datvetau_cancel_booking'] ) && check_admin_referer( 'datvetau_cancel_booking_' . (int) $_GET['datvetau_cancel_booking'] ) ) {
			Datvetau_Booking_Service::cancel_booking( (int) $_GET['datvetau_cancel_booking'] );
			wp_safe_redirect( admin_url( 'admin.php?page=datvetau-booking&cancelled=1' ) );
			exit;
		}
	}

	public static function page_bookings(): void {
		if ( ! empty( $_GET['booking_id'] ) ) {
			$booking_id = (int) $_GET['booking_id'];
			$booking      = Datvetau_Booking_Booking_Repository::find_by_id( $booking_id );
			if ( ! $booking ) {
				wp_die( esc_html__( 'Không tìm thấy đơn.', 'datvetaucaotoc-booking' ) );
			}
			$passengers = Datvetau_Booking_Booking_Repository::passengers_for_booking( $booking_id );
			$route      = Datvetau_Booking_Route_Repository::find_by_id( (int) $booking['route_id'] );
			$outbound   = Datvetau_Booking_Trip_Repository::find_by_id( (int) $booking['outbound_trip_id'] );
			$inbound    = ! empty( $booking['inbound_trip_id'] )
				? Datvetau_Booking_Trip_Repository::find_by_id( (int) $booking['inbound_trip_id'] )
				: null;
			include DATVETAU_BOOKING_DIR . 'includes/admin/views/booking-detail.php';
			return;
		}

		$booking_search = isset( $_GET['booking_search'] ) ? sanitize_text_field( wp_unslash( (string) $_GET['booking_search'] ) ) : '';
		$booking_status = isset( $_GET['booking_status'] ) ? sanitize_key( wp_unslash( (string) $_GET['booking_status'] ) ) : '';
		$bookings       = Datvetau_Booking_Booking_Repository::list_for_admin(
			array(
				'search' => $booking_search,
				'status' => $booking_status,
				'limit'  => 200,
			)
		);
		include DATVETAU_BOOKING_DIR . 'includes/admin/views/bookings-list.php';
	}

	public static function page_routes(): void {
		$routes = Datvetau_Booking_Route_Repository::list_all();
		$edit   = ! empty( $_GET['edit'] ) ? Datvetau_Booking_Route_Repository::find_by_id( (int) $_GET['edit'] ) : null;
		include DATVETAU_BOOKING_DIR . 'includes/admin/views/routes.php';
	}

	public static function page_trips(): void {
		$route_filter = ! empty( $_GET['route_id'] ) ? (int) $_GET['route_id'] : null;
		$month        = ! empty( $_GET['month'] ) ? (string) $_GET['month'] : gmdate( 'Y-m' );
		$trips        = Datvetau_Booking_Trip_Repository::list_for_admin( $route_filter, $month );
		$routes       = Datvetau_Booking_Route_Repository::list_all();
		$edit         = ! empty( $_GET['edit'] ) ? Datvetau_Booking_Trip_Repository::find_by_id( (int) $_GET['edit'] ) : null;
		include DATVETAU_BOOKING_DIR . 'includes/admin/views/trips.php';
	}

	public static function page_import(): void {
		$result = get_transient( 'datvetau_import_result' );
		if ( $result ) {
			delete_transient( 'datvetau_import_result' );
		}
		include DATVETAU_BOOKING_DIR . 'includes/admin/views/import.php';
	}

	public static function page_settings(): void {
		$settings = Datvetau_Booking_Settings::all();
		include DATVETAU_BOOKING_DIR . 'includes/admin/views/settings.php';
	}

	/**
	 * @param array<string,string> $extra
	 * @param array<string,string>|null $from_post redirect_route_id, redirect_month
	 */
	private static function trips_admin_url( array $extra = array(), ?array $from_post = null ): string {
		$args = array( 'page' => 'datvetau-booking-trips' );

		if ( null !== $from_post ) {
			$route = (string) ( $from_post['redirect_route_id'] ?? '' );
			if ( '' !== $route && ctype_digit( $route ) ) {
				$args['route_id'] = (int) $route;
			}
			$month = (string) ( $from_post['redirect_month'] ?? '' );
			if ( preg_match( '/^\d{4}-\d{2}$/', $month ) ) {
				$args['month'] = $month;
			}
		} else {
			if ( ! empty( $_GET['route_id'] ) ) {
				$args['route_id'] = (int) $_GET['route_id'];
			}
			if ( ! empty( $_GET['month'] ) && preg_match( '/^\d{4}-\d{2}$/', (string) $_GET['month'] ) ) {
				$args['month'] = (string) $_GET['month'];
			}
		}

		return add_query_arg( array_merge( $args, $extra ), admin_url( 'admin.php' ) );
	}
}
