// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

use anyhow::Result;

use crate::app::TransportWrapper;
use crate::bootstrap::{Bootstrap, UpdateProtocol};
use crate::spiflash::SpiFlash;
use crate::transport::Capability;

/// Implements the SPI EEPROM bootstrap protocol.
pub struct Eeprom;

impl Eeprom {
    /// Creates a new `Eeprom` protocol updater.
    pub fn new() -> Self {
        Eeprom
    }
}

impl UpdateProtocol for Eeprom {
    fn verify_capabilities(
        &self,
        _container: &Bootstrap,
        transport: &TransportWrapper,
    ) -> Result<()> {
        transport
            .capabilities()?
            .request(Capability::GPIO | Capability::SPI)
            .ok()?;
        Ok(())
    }

    fn uses_common_bootstrap_reset(&self) -> bool {
        true
    }

    /// Performs the update protocol using the `transport` with the firmware `payload`.
    fn update(
        &self,
        container: &Bootstrap,
        transport: &TransportWrapper,
        payload: &[u8],
        progress: &dyn Fn(u32, u32),
    ) -> Result<()> {
        let spi = container.spi_params.create(transport, "BOOTSTRAP")?;
        let flash = SpiFlash::from_spi(&*spi)?;
        flash.chip_erase(&*spi)?;
        flash.program_with_progress(&*spi, 0, payload, progress)?;
        SpiFlash::chip_reset(&*spi)?;
        Ok(())
    }
}
