// Copyright 2025 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use starnix_core::task::CurrentTask;
use starnix_core::vfs::{
    FileObject, FileOps, InputBuffer, OutputBuffer, SeekTarget, fileops_impl_noop_sync,
};
use starnix_logging::{log_debug, track_stub};
use starnix_sync::{FileOpsCore, Locked, Unlocked};
use starnix_syscalls::{SUCCESS, SyscallArg, SyscallResult};
use starnix_uapi::RTC_SET_TIME;
use starnix_uapi::errors::{Errno, error};

/// Implements Real Time Clock (RTC) operations.
pub struct RtcFile;

impl RtcFile {
    /// Create a new RTC device file.
    pub fn new_file(_current_task: &CurrentTask) -> Result<Box<dyn FileOps>, Errno> {
        Ok(Box::new(Self {}))
    }
}

impl FileOps for RtcFile {
    fileops_impl_noop_sync!();

    fn is_seekable(&self) -> bool {
        false
    }

    fn seek(
        &self,
        _locked: &mut Locked<FileOpsCore>,
        _file: &FileObject,
        _current_task: &CurrentTask,
        _current_offset: starnix_uapi::off_t,
        _target: SeekTarget,
    ) -> Result<starnix_uapi::off_t, starnix_uapi::errors::Errno> {
        error!(ESPIPE, "seek on rtc")
    }

    fn ioctl(
        &self,
        _locked: &mut Locked<Unlocked>,
        _file: &FileObject,
        _current_task: &CurrentTask,
        request: u32,
        arg: SyscallArg,
    ) -> Result<SyscallResult, Errno> {
        match request {
            RTC_SET_TIME => {
                // Ignore the request, return success. Starnix updates the time through
                // settimeofday. This ioctl might be important for programs that are
                // allowed to set the RTC reported time directly. We do not currently
                // have plans to make that available.
                track_stub!(
                    TODO("https://fxbug.dev/469486947"),
                    "rtc ioctl RTC_SET_TIME incomplete implementation",
                    RTC_SET_TIME
                );
                log_debug!("RtcFile::ioctl: RTC_SET_TIME {arg:?}");
                Ok(SUCCESS)
            }
            unknown_ioctl => {
                track_stub!(TODO("https://fxbug.dev/322874368"), "rtc ioctl", unknown_ioctl);
                error!(ENOSYS, format!("rtc ioctl: {unknown_ioctl}"))
            }
        }
    }

    fn read(
        &self,
        _locked: &mut Locked<FileOpsCore>,
        _file: &FileObject,
        _current_task: &CurrentTask,
        offset: usize,
        _data: &mut dyn OutputBuffer,
    ) -> Result<usize, Errno> {
        // because fileops_impl_nonseekable!()
        debug_assert!(offset == 0);
        error!(EINVAL, "read on rtc")
    }

    fn write(
        &self,
        _locked: &mut Locked<FileOpsCore>,
        _file: &FileObject,
        _current_task: &CurrentTask,
        offset: usize,
        _data: &mut dyn InputBuffer,
    ) -> Result<usize, Errno> {
        // because fileops_impl_nonseekable!()
        debug_assert!(offset == 0);
        error!(EINVAL, "write on rtc")
    }
}
