from models.model import Model
from models.pallet import Palette


class Profile(Model):
    def __init__(self):
        """Profile model.

        Each profile owns a single, unique palette stored in the Palette model.
        The profile stores a `palette_id` that points to its palette; any legacy
        inline `palette` arrays are migrated to a dedicated Palette entry.
        """
        super().__init__()
        self._palette_model = Palette()

        # Migrate legacy inline palettes to separate Palette entries.
        changed = False
        for pid, pdata in list(self.items()):
            if isinstance(pdata, dict):
                if "palette" in pdata and "palette_id" not in pdata:
                    colors = pdata.get("palette") or []
                    palette_id = self._palette_model.create(colors=colors)
                    pdata.pop("palette", None)
                    pdata["palette_id"] = str(palette_id)
                    changed = True
        if changed:
            self.save()

    def create(self, name="", profile_type="zones"):
        """Create a new profile and its own empty palette.

        profile_type: "zones" or "scenes" (ignoring scenes for now)
        """
        next_id = self.get_next_id()
        # Create a unique palette for this profile.
        palette_id = self._palette_model.create(colors=[])
        self[next_id] = {
            "name": name,
            "type": profile_type,  # "zones" or "scenes"
            "zones": [],  # Array of zone IDs
            "scenes": [],  # Array of scene IDs (for future use)
            "palette_id": str(palette_id),
        }
        self.save()
        return next_id

    def read(self, id):
        id_str = str(id)
        return self.get(id_str, None)
    
    def update(self, id, data):
        id_str = str(id)
        if id_str not in self:
            return False
        self[id_str].update(data)
        self.save()
        return True
    
    def delete(self, id):
        id_str = str(id)
        if id_str not in self:
            return False
        self.pop(id_str)
        self.save()
        return True
    
    def list(self):
        return list(self.keys())
    