package com.fieldlabel.collector.domain.model

import java.time.LocalDate
import java.time.LocalDateTime

/**
 * 採集レコード — アプリ内で扱うドメインモデル
 *
 * @param id             内部UUID（Room主キー）
 * @param locationId     表示用地点ID  例: LOC-2026-0001
 * @param specimenNumber 地点内の標本通し番号 (1, 2, 3…)
 * @param specimenId     表示用標本ID  例: LOC-2026-0001-01
 * @param collectionDate 採集日
 * @param latitude       緯度 (WGS84)
 * @param longitude      経度 (WGS84)
 * @param altitude       標高 (m, nullable)
 * @param address        逆ジオコーディングで取得した住所（オフライン時は null）
 * @param collectorName  採集者名
 * @param notes          備考
 * @param synced         Firestoreへの同期済みフラグ
 * @param createdAt      レコード作成日時
 */
data class CollectionRecord(
    val id: String,
    val locationId: String,
    val specimenNumber: Int,
    val specimenId: String,
    val collectionDate: LocalDate,
    val latitude: Double,
    val longitude: Double,
    val altitude: Double?,
    val address: String?,
    val collectorName: String,
    val notes: String,
    val synced: Boolean = false,
    val createdAt: LocalDateTime = LocalDateTime.now(),
    /** 貼り付け先チューブの外径 (mm)。null = フラット面（補正なし） */
    val tubeDiameterMm: Float? = null
) {
    /**
     * QRコードに埋め込む URL。
     * Google マップで採集地点を開けるシンプルなリンク。
     * パラメータを最小限にすることで QR コードのデータ量を減らし、
     * 小さいサイズでも読み取りやすくする。
     *
     * 例: https://maps.google.com/?q=35.678900,139.765400
     */
    val qrPayload: String
        get() {
            val lat = "%.6f".format(latitude)
            val lng = "%.6f".format(longitude)
            return "https://maps.google.com/?q=$lat,$lng"
        }

    /** ラベル印刷用の住所テキスト（住所があれば住所、なければ座標） */
    val displayLocation: String
        get() = if (!address.isNullOrBlank()) address
        else "${"%.5f".format(latitude)}°N, ${"%.5f".format(longitude)}°E"
}

/** 地点セッション — 同じ地点で複数標本を採集するときに使う */
data class LocationSession(
    val locationId: String,
    var latitude: Double,          // 地図で微調整可能
    var longitude: Double,         // 地図で微調整可能
    var altitude: Double?,         // GPS 標高 (m, nullable)
    var address: String?,          // 再ジオコーディング後に更新
    val collectionDate: LocalDate,
    val collectorName: String,
    var nextSpecimenNumber: Int = 1
)
