"""Mengelompokkan pengalaman kerja per perusahaan.

Di database, satu posisi = satu baris Experience. Itu memang bentuk yang benar:
tiap posisi punya tanggal, deskripsi, dan skill sendiri.

Tapi kalau langsung ditampilkan apa adanya, nama dan logo perusahaan muncul
berulang untuk orang yang pernah naik jabatan di tempat yang sama. Modul ini
menggabungkannya saat dirender — mirip cara LinkedIn menampilkan promosi.

Penggabungan hanya berlaku untuk entri yang BERURUTAN. Jadi kalau seseorang
bekerja di A, pindah ke B, lalu kembali ke A, dua masa kerja di A tetap tampil
terpisah — bukan disatukan dan membuat urutan waktunya kacau.
"""

from careers.models import humanize_duration


class ExperienceGroup:
    """Satu perusahaan beserta posisi-posisi yang pernah dipegang di sana."""

    def __init__(self, pengalaman):
        self.key = pengalaman.company.strip().lower()
        self.roles = [pengalaman]

    def add(self, pengalaman):
        self.roles.append(pengalaman)

    # --------------------------------------------------------------- identitas
    @property
    def is_multi(self):
        """True kalau ada lebih dari satu posisi — pemicu tampilan bertingkat."""
        return len(self.roles) > 1

    @property
    def company(self):
        return self.roles[0].company

    @property
    def company_url(self):
        # Ambil dari posisi mana pun yang mengisinya.
        for r in self.roles:
            if r.company_url:
                return r.company_url
        return ""

    @property
    def logo(self):
        for r in self.roles:
            if r.logo:
                return r.logo
        return None

    # ----------------------------------------------------------------- periode
    @property
    def is_current(self):
        return any(r.is_current for r in self.roles)

    @property
    def start_date(self):
        """Tanggal mulai paling awal di perusahaan ini."""
        return min(r.start_date for r in self.roles if r.start_date)

    @property
    def end_date(self):
        if self.is_current:
            return None
        akhir = [r.end_date for r in self.roles if r.end_date]
        return max(akhir) if akhir else None

    @property
    def period(self):
        mulai = self.start_date.strftime("%b %Y") if self.start_date else ""
        if self.is_current:
            return f"{mulai} - Sekarang"
        selesai = self.end_date.strftime("%b %Y") if self.end_date else "Sekarang"
        return f"{mulai} - {selesai}"

    @property
    def duration(self):
        """Total lama bekerja di perusahaan ini, lintas semua posisi."""
        return humanize_duration(self.start_date, self.end_date)

    # ------------------------------------------------------------------ lain
    @property
    def location(self):
        for r in self.roles:
            if r.location:
                return r.location
        return ""

    @property
    def location_type_display(self):
        return self.roles[0].get_location_type_display()

    @property
    def employment_type_display(self):
        """Kalau semua posisi tipenya sama, tampilkan sekali di header."""
        tipe = {r.employment_type for r in self.roles}
        if len(tipe) == 1:
            return self.roles[0].get_employment_type_display()
        return ""

    @property
    def skills(self):
        """Gabungan skill dari semua posisi, tanpa duplikat, urutan dipertahankan."""
        terlihat, hasil = set(), []
        for r in self.roles:
            for s in r.skills.all():
                if s.pk not in terlihat:
                    terlihat.add(s.pk)
                    hasil.append(s)
        return hasil


def group_experiences(pengalaman_list):
    """Ubah daftar Experience jadi daftar ExperienceGroup.

    Urutan aslinya dipertahankan; hanya entri berurutan dengan nama perusahaan
    sama yang digabung.
    """
    grup = []
    for pengalaman in pengalaman_list:
        kunci = pengalaman.company.strip().lower()
        if grup and grup[-1].key == kunci:
            grup[-1].add(pengalaman)
        else:
            grup.append(ExperienceGroup(pengalaman))
    return grup
