from dataclasses import dataclass, field
from typing import List, Dict
import json
from pathlib import Path


@dataclass
class ExposureProfile:
    """Профиль выдержки для определённого ISO"""
    iso: int
    exposure_seconds: int
    dark_count: int = 20
    flat_count: int = 30
    bias_count: int = 50


@dataclass
class LensProfile:
    """Профиль объектива"""
    name: str
    aperture: str  # например "f/2.8"
    flat_duration_minutes: int = 10  # когда снимать Flat (рассвет/закат)


@dataclass
class CameraProfile:
    """Профиль камеры"""
    name: str  # "Canon EOS 600D"
    sensor_type: str = "APS-C"  # APS-C, Full Frame
    pixel_size_um: float = 4.3
    read_noise_e: float = 2.5

    # Настройки по умолчанию
    default_iso: int = 800
    default_exposure: int = 120

    # Профили выдержек
    exposures: List[ExposureProfile] = field(default_factory=list)

    # Объективы
    lenses: List[LensProfile] = field(default_factory=list)

    def save(self, config_service):
        """Сохраняет профиль в конфиг"""
        config_service.save_camera_profile(self)

    def to_dict(self) -> dict:
        return {
            'name': self.name,
            'sensor_type': self.sensor_type,
            'pixel_size_um': self.pixel_size_um,
            'read_noise_e': self.read_noise_e,
            'default_iso': self.default_iso,
            'default_exposure': self.default_exposure,
            'exposures': [
                {
                    'iso': e.iso,
                    'exposure_seconds': e.exposure_seconds,
                    'dark_count': e.dark_count,
                    'flat_count': e.flat_count,
                    'bias_count': e.bias_count
                }
                for e in self.exposures
            ],
            'lenses': [
                {
                    'name': l.name,
                    'aperture': l.aperture,
                    'flat_duration_minutes': l.flat_duration_minutes
                }
                for l in self.lenses
            ]
        }

    @classmethod
    def from_dict(cls, data: dict) -> 'CameraProfile':
        exposures = [
            ExposureProfile(
                iso=e['iso'],
                exposure_seconds=e['exposure_seconds'],
                dark_count=e.get('dark_count', 20),
                flat_count=e.get('flat_count', 30),
                bias_count=e.get('bias_count', 50)
            )
            for e in data.get('exposures', [])
        ]

        lenses = [
            LensProfile(
                name=l['name'],
                aperture=l['aperture'],
                flat_duration_minutes=l.get('flat_duration_minutes', 10)
            )
            for l in data.get('lenses', [])
        ]

        return cls(
            name=data['name'],
            sensor_type=data.get('sensor_type', 'APS-C'),
            pixel_size_um=data.get('pixel_size_um', 4.3),
            read_noise_e=data.get('read_noise_e', 2.5),
            default_iso=data.get('default_iso', 800),
            default_exposure=data.get('default_exposure', 120),
            exposures=exposures,
            lenses=lenses
        )