from owrx.source import SdrSource
from pycsdr.modules import Buffer, FirDecimate, Shift
from pycsdr.types import Format
from csdr.chain import Chain

import logging

logger = logging.getLogger(__name__)


class Resampler(SdrSource):
    def onPropertyChange(self, changes):
        logger.warning("Resampler is unable to handle property changes: {0}".format(changes))

    def __init__(self, props, sdr):
        sdrProps = sdr.getProps()
        shift = (sdrProps["center_freq"] - props["center_freq"]) / sdrProps["samp_rate"]
        decimation = int(float(sdrProps["samp_rate"]) / props["samp_rate"])
        if_samp_rate = sdrProps["samp_rate"] / decimation
        transition_bw = 0.15 * (if_samp_rate / float(sdrProps["samp_rate"]))
        props["samp_rate"] = if_samp_rate

        self.chain = Chain([
            Shift(shift),
            FirDecimate(decimation, transition_bw)
        ])

        self.chain.setReader(sdr.getBuffer().getReader())

        super().__init__(None, props)

    def getBuffer(self):
        if self.buffer is None:
            self.buffer = Buffer(Format.COMPLEX_FLOAT)
            self.chain.setWriter(self.buffer)
        return self.buffer

    def stop(self):
        self.chain.stop()
        self.chain = None
        super().stop()

    def activateProfile(self, profile_id=None):
        logger.warning("Resampler does not support setting profiles")
        pass

    def validateProfiles(self):
        # resampler does not support profiles
        pass
