<?php
session_start();

define('CONTACTS_FILE_DIR', __DIR__ . '/data/');
define('CONTACTS_FILE_NAME', 'contacts.tsv');
define('CONTACTS_FILE_PATH', CONTACTS_FILE_DIR . CONTACTS_FILE_NAME);
define('MAX_NAME_LENGTH', 50);
define('MAX_MESSAGE_LENGTH', 1000);

define('STATUS_UNCONFIRMED', 0);
define('STATUS_CONFIRMED', 1);

if (!is_dir(CONTACTS_FILE_DIR)) {
    if (!mkdir(CONTACTS_FILE_DIR, 0755, true)) {
        die('連絡事項保存用ディレクトリの作成に失敗しました。パーミッションを確認してください。');
    }
}

$errors = [];
$form_data = [
    'name' => '',
    'message_text' => ''
];

// 連絡事項の追加処理 (変更なし)
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['action']) && $_POST['action'] == 'add_contact') {
    $form_data['name'] = isset($_POST['name']) ? trim($_POST['name']) : '';
    $form_data['message_text'] = isset($_POST['message_text']) ? trim($_POST['message_text']) : '';

    if (empty($form_data['name'])) $errors[] = "名前を入力してください。";
    elseif (mb_strlen($form_data['name']) > MAX_NAME_LENGTH) $errors[] = "名前は" . MAX_NAME_LENGTH . "文字以内で入力してください。";
    if (empty($form_data['message_text'])) $errors[] = "連絡事項を入力してください。";
    elseif (mb_strlen($form_data['message_text']) > MAX_MESSAGE_LENGTH) $errors[] = "連絡事項は" . MAX_MESSAGE_LENGTH . "文字以内で入力してください。";

    if (empty($errors)) {
        $id = uniqid('contact_', true);
        $timestamp = date("Y-m-d H:i:s");
        $name_to_save = str_replace(["\t", "\r", "\n"], " ", $form_data['name']);
        $message_to_save = str_replace(["\r\n", "\r", "\n"], "<br_temp>", $form_data['message_text']);
        $message_to_save = str_replace("\t", "    ", $message_to_save);
        $status = STATUS_UNCONFIRMED;

        $data_line = $id . "\t" . $timestamp . "\t" . $name_to_save . "\t" . $message_to_save . "\t" . $status . PHP_EOL;

        $fp = fopen(CONTACTS_FILE_PATH, 'ab');
        if ($fp) {
            if (flock($fp, LOCK_EX)) {
                if (fwrite($fp, $data_line) === false) {
                    $_SESSION['message_display'] = "連絡事項の保存に失敗しました。(書き込みエラー)"; $_SESSION['message_type'] = "error";
                } else {
                    $_SESSION['message_display'] = "連絡事項が追加されました！"; $_SESSION['message_type'] = "success";
                    $form_data = ['name' => '', 'message_text' => ''];
                }
                flock($fp, LOCK_UN);
            } else { $_SESSION['message_display'] = "連絡事項の保存に失敗しました。(ロック取得失敗)"; $_SESSION['message_type'] = "error"; }
            fclose($fp);
        } else { $_SESSION['message_display'] = "連絡事項の保存に失敗しました。(ファイルオープン失敗)"; $_SESSION['message_type'] = "error"; }
        header("Location: " . $_SERVER['PHP_SELF']); exit;
    } else {
        $_SESSION['message_display'] = implode("<br>", $errors); $_SESSION['message_type'] = "error";
        $_SESSION['form_data'] = $form_data;
        header("Location: " . $_SERVER['PHP_SELF']); exit;
    }
}

// 連絡事項の削除処理 (変更なし)
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['action']) && $_POST['action'] == 'delete_contact' && isset($_POST['contact_id'])) {
    $contact_id_to_delete = trim($_POST['contact_id']);
    $temp_file_path = CONTACTS_FILE_DIR . 'contacts_temp.tsv';
    $deleted = false;
    if (file_exists(CONTACTS_FILE_PATH)) {
        $fp_read = fopen(CONTACTS_FILE_PATH, 'rb'); $fp_write = fopen($temp_file_path, 'wb');
        if ($fp_read && $fp_write) {
            if (flock($fp_read, LOCK_SH) && flock($fp_write, LOCK_EX)) {
                while (($line = fgets($fp_read)) !== false) {
                    $parts = explode("\t", $line);
                    if (isset($parts[0]) && trim($parts[0]) === $contact_id_to_delete) { $deleted = true; }
                    else { fwrite($fp_write, $line); }
                }
                flock($fp_write, LOCK_UN); flock($fp_read, LOCK_UN);
            } else { $_SESSION['message_display'] = "ファイルのロックに失敗しました(削除時)。"; $_SESSION['message_type'] = "error"; }
            fclose($fp_read); fclose($fp_write);
            if ($deleted) {
                if (rename($temp_file_path, CONTACTS_FILE_PATH)) { $_SESSION['message_display'] = "連絡事項が削除されました。"; $_SESSION['message_type'] = "success"; }
                else { $_SESSION['message_display'] = "ファイル更新に失敗しました(削除時)。"; $_SESSION['message_type'] = "error"; @unlink($temp_file_path); }
            } else { $_SESSION['message_display'] = "削除対象の連絡事項が見つかりませんでした。"; $_SESSION['message_type'] = "error"; @unlink($temp_file_path); }
        } else { if($fp_read) fclose($fp_read); if($fp_write) fclose($fp_write); @unlink($temp_file_path); $_SESSION['message_display'] = "ファイル操作に失敗しました(削除時)。"; $_SESSION['message_type'] = "error"; }
    } else { $_SESSION['message_display'] = "連絡事項ファイルが見つかりません。"; $_SESSION['message_type'] = "error"; }
    header("Location: " . $_SERVER['PHP_SELF']); exit;
}

// 確認状態のトグル処理 (変更なし)
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['action']) && $_POST['action'] == 'toggle_confirm' && isset($_POST['contact_id'])) {
    $contact_id_to_toggle = trim($_POST['contact_id']);
    $temp_file_path = CONTACTS_FILE_DIR . 'contacts_temp.tsv';
    $toggled = false;
    if (file_exists(CONTACTS_FILE_PATH)) {
        $fp_read = fopen(CONTACTS_FILE_PATH, 'rb'); $fp_write = fopen($temp_file_path, 'wb');
        if ($fp_read && $fp_write) {
            if (flock($fp_read, LOCK_SH) && flock($fp_write, LOCK_EX)) {
                while (($line = fgets($fp_read)) !== false) {
                    $parts = explode("\t", rtrim($line, PHP_EOL));
                    if (isset($parts[0]) && trim($parts[0]) === $contact_id_to_toggle) {
                        $current_status = isset($parts[4]) ? (int)$parts[4] : STATUS_UNCONFIRMED;
                        $new_status = ($current_status == STATUS_CONFIRMED) ? STATUS_UNCONFIRMED : STATUS_CONFIRMED;
                        $parts[4] = $new_status;
                        $line = implode("\t", $parts) . PHP_EOL;
                        $toggled = true;
                    }
                    fwrite($fp_write, $line);
                }
                flock($fp_write, LOCK_UN); flock($fp_read, LOCK_UN);
            } else { $_SESSION['message_display'] = "ファイルのロックに失敗しました(状態更新時)。"; $_SESSION['message_type'] = "error"; }
            fclose($fp_read); fclose($fp_write);
            if ($toggled) {
                if (rename($temp_file_path, CONTACTS_FILE_PATH)) { $_SESSION['message_display'] = "確認状態が更新されました。"; $_SESSION['message_type'] = "success"; }
                else { $_SESSION['message_display'] = "ファイル更新に失敗しました(状態更新時)。"; $_SESSION['message_type'] = "error"; @unlink($temp_file_path); }
            } else { $_SESSION['message_display'] = "対象の連絡事項が見つかりませんでした(状態更新時)。"; $_SESSION['message_type'] = "error"; @unlink($temp_file_path); }
        } else { if($fp_read) fclose($fp_read); if($fp_write) fclose($fp_write); @unlink($temp_file_path); $_SESSION['message_display'] = "ファイル操作に失敗しました(状態更新時)。"; $_SESSION['message_type'] = "error"; }
    } else { $_SESSION['message_display'] = "連絡事項ファイルが見つかりません。"; $_SESSION['message_type'] = "error"; }
    header("Location: " . $_SERVER['PHP_SELF']); exit;
}

if (isset($_SESSION['message_display'])) { $page_message = $_SESSION['message_display']; $page_message_type = $_SESSION['message_type']; unset($_SESSION['message_display']); unset($_SESSION['message_type']); }
if (isset($_SESSION['form_data'])) { $form_data = $_SESSION['form_data']; unset($_SESSION['form_data']); }

function display_contacts() {
    if (!file_exists(CONTACTS_FILE_PATH) || filesize(CONTACTS_FILE_PATH) === 0) {
        echo "<p>まだ連絡事項はありません。</p>"; return;
    }
    $lines_array = file(CONTACTS_FILE_PATH, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    if ($lines_array === false) { echo "<p>連絡事項ファイルの読み込みに失敗しました。</p>"; return; }
    $lines_array = array_reverse($lines_array);

    $contacts_html = "";
    foreach ($lines_array as $line) {
        $parts = explode("\t", $line, 5);
        if (count($parts) >= 4) {
            $id = htmlspecialchars($parts[0], ENT_QUOTES, 'UTF-8');
            $timestamp = htmlspecialchars($parts[1], ENT_QUOTES, 'UTF-8');
            $name = htmlspecialchars($parts[2], ENT_QUOTES, 'UTF-8');
            $message_text_raw = str_replace("<br_temp>", "\n", $parts[3]);
            $message_text_display = nl2br(htmlspecialchars($message_text_raw, ENT_QUOTES, 'UTF-8'));
            $status = isset($parts[4]) ? (int)$parts[4] : STATUS_UNCONFIRMED;

            $confirm_button_text = "";
            $confirm_dialog_message = "";
            $button_confirm_class = "";

            if ($status == STATUS_CONFIRMED) {
                $confirm_button_text = "確認済み";
                $confirm_dialog_message = "この連絡事項を未確認に戻しますか？";
                $button_confirm_class = "is-confirmed";
            } else {
                $confirm_button_text = "確認済みにする";
                $confirm_dialog_message = "この連絡事項を確認済みにしますか？";
                $button_confirm_class = "is-unconfirmed";
            }

            $item_class = ($status == STATUS_CONFIRMED) ? "contact-item confirmed" : "contact-item";

            $contacts_html .= "<div class='" . $item_class . "'>" .
                             "<div class='contact-header'>" .
                             "<strong>" . $name . "</strong>" .
                             "<small class='contact-date'> (" . $timestamp . ")</small>" .
                             "<form method='post' action='" . htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, 'UTF-8') . "' class='confirm-button-form' onsubmit='return confirm(\"" . htmlspecialchars($confirm_dialog_message, ENT_QUOTES, 'UTF-8') . "\");'>" .
                             "<input type='hidden' name='action' value='toggle_confirm'>" .
                             "<input type='hidden' name='contact_id' value='" . $id . "'>" .
                             "<button type='submit' class='button-confirm " . $button_confirm_class . "'>" . $confirm_button_text . "</button>" .
                             "</form>" .
                             "<form method='post' action='" . htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, 'UTF-8') . "' class='delete-button-form' onsubmit='return confirm(\"この連絡事項を削除してもよろしいですか？\");'>" .
                             "<input type='hidden' name='action' value='delete_contact'>" .
                             "<input type='hidden' name='contact_id' value='" . $id . "'>" .
                             "<button type='submit' class='button-delete-item'>削除</button>" .
                             "</form>" .
                             "</div>" .
                             "<p>" . $message_text_display . "</p>" .
                             "</div>";
        }
    }
    echo $contacts_html;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>連絡事項</title>
    <style>
        body { font-family: sans-serif; line-height: 1.6; margin: 20px; background-color: #f4f4f4; color: #333; }
        .container { max-width: 600px; margin: auto; background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }
        h1 { text-align: center; color: #333; }
        label { display: block; margin-bottom: 8px; font-weight: bold; }
        input[type="text"], textarea {
            width: calc(100% - 22px); padding: 10px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box;
        }
        textarea { min-height: 60px; resize: vertical; }
        button[type="submit"] { background-color: #28a745; color: white; padding: 10px 15px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
        button[type="submit"]:hover { background-color: #218838; }

        .message { padding: 10px; margin-bottom: 15px; border-radius: 4px; border-width: 1px; border-style: solid; }
        .success { background-color: #d4edda; color: #155724; border-color: #c3e6cb; }
        .error { background-color: #f8d7da; color: #721c24; border-color: #f5c6cb; }
        .info { background-color: #d1ecf1; color: #0c5460; border-color: #bee5eb; }

        .contacts-display { margin-top: 30px; border-top: 1px solid #eee; padding-top: 20px; }
        .contact-item {
            padding: 10px 15px; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #eee #eee #eee; /* 右と下は薄いグレー、左は状態に応じて */
            border-radius: 4px; margin-bottom: 10px;
            transition: background-color 0.3s ease, border-left-color 0.3s ease;
        }
        .contact-item.confirmed {
            background-color: #e6ffe6; /* 確認済みの背景色 (薄い緑) */
            border-left-color: #28a745; /* 緑のアクセントボーダー */
        }
        .contact-item:not(.confirmed) {
            background-color: #e0f7fa; /* 未確認の背景色 (薄い水色) */
            border-left-color: #007bff; /* 青のアクセントボーダー */
        }

        .contact-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; flex-wrap: wrap; }
        .contact-item strong { margin-right: 5px; }
        .contact-item .contact-date { font-size: 0.9em; color: #777; flex-grow: 1; min-width: 150px; }
        .contact-item p { margin-top: 5px; margin-bottom: 0; word-wrap: break-word; border: 1px solid #ccc; padding: 8px 10px; background-color: #fff; border-radius: 3px; }
        .delete-button-form, .confirm-button-form { display: inline-block; margin-left: 5px; }
        .button-delete-item, .button-confirm { color: white; padding: 3px 8px; border: none; border-radius: 3px; cursor: pointer; font-size: 0.85em; transition: background-color 0.2s ease; }
        .button-delete-item { background-color: #dc3545; }
        .button-delete-item:hover { background-color: #c82333; }

        .button-confirm.is-unconfirmed { background-color: #007bff; }
        .button-confirm.is-unconfirmed:hover { background-color: #0056b3; }
        .button-confirm.is-confirmed { background-color: #ffc107; color: #212529; }
        .button-confirm.is-confirmed:hover { background-color: #e0a800; }
    </style>
</head>
<body>
    <div class="container">
        <h1>連絡事項</h1>
        <?php if (isset($page_message) && !empty($page_message)): ?>
            <div class="message <?php echo htmlspecialchars($page_message_type, ENT_QUOTES, 'UTF-8'); ?>">
                <?php echo $page_message; ?>
            </div>
        <?php endif; ?>
        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, 'UTF-8'); ?>" method="post">
            <input type="hidden" name="action" value="add_contact">
            <div>
                <label for="name">名前:</label>
                <input type="text" id="name" name="name" value="<?php echo htmlspecialchars($form_data['name'], ENT_QUOTES, 'UTF-8'); ?>" required maxlength="<?php echo MAX_NAME_LENGTH; ?>">
            </div>
            <div>
                <label for="message_text">連絡事項:</label>
                <textarea id="message_text" name="message_text" rows="3" required maxlength="<?php echo MAX_MESSAGE_LENGTH; ?>"><?php echo htmlspecialchars($form_data['message_text'], ENT_QUOTES, 'UTF-8'); ?></textarea>
            </div>
            <div>
                <button type="submit">追加</button>
            </div>
        </form>
        <div class="contacts-display">
            <?php display_contacts(); ?>
        </div>
    </div>
</body>
</html>