<?php

/**
 * Vvveb
 *
 * Copyright (C) 2022  Ziadin Givan
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 */

namespace Vvveb\Plugins\ContactForm\Controller;

use function Vvveb\__;
use function Vvveb\humanReadable;
use function Vvveb\model;
use Vvveb\Controller\Listing;

class Messages extends Listing {
	protected string $type = 'message';

	protected string $modelName = 'Plugins\ContactForm\Message';

	//protected $model = 'message';

	protected string $list = 'message';

	protected string $controller = 'message';

	protected string $listController = 'messages';

	protected string $module = 'plugins/contact-form';

	function index(): void {
		parent::index();

		//expand fields in the json
		if ($this->view->message) {
			foreach ($this->view->message as &$message) {
				$data = json_decode($message['data'] ?? '{}', true);

				if (is_array($data)) {
					$message += $data;
				}
			}
		}
	}

	/**
	 * Export messages as CSV, flattening the submitted form fields.
	 */
	function csv(): void {
		$list = model($this->modelName);
		$rows = $list->getAll(['start' => 0, 'limit' => 100000] + $this->global)['message'] ?? [];

		//collect every field submitted across all forms (capped for sanity)
		$fields = [];
		$expanded = [];

		foreach ($rows as $row) {
			$data = json_decode($row['data'] ?? '{}', true) ?: [];
			unset($data['csrf']);
			$expanded[] = [$row, $data];

			foreach (array_keys($data) as $key) {
				if (! in_array($key, $fields) && count($fields) < 20) {
					$fields[] = $key;
				}
			}
		}

		header('Content-Type: text/csv; charset=utf-8');
		header('Content-Disposition: attachment; filename="contact-form-messages.csv"');

		$fp = fopen('php://output', 'w');
		fputcsv($fp, array_merge(
			['Message ID', 'Type', 'Date', 'Status'],
			array_map(fn ($f) => __(humanReadable($f)), $fields)
		));

		foreach ($expanded as [$row, $data]) {
			$line = [
				$row['message_id'] ?? '',
				$row['type'] ?? '',
				$row['created_at'] ?? '',
				(empty($row['status']) ? 'Unread' : 'Read'),
			];

			foreach ($fields as $field) {
				$value = $data[$field] ?? '';
				$line[] = is_array($value) ? json_encode($value) : $value;
			}

			fputcsv($fp, $line);
		}

		fclose($fp);
		die();
	}
}
