use tracing::info;

use super::Issue;
pub(crate) use crate::integrations::gitea::ListIssuesError as Error;
use crate::{
    integrations::gitea::{ListIssuesError, list_issues},
    prompt,
    state::{self, RunType, State},
};

pub(crate) fn select_issue(
    labels: Option<&[String]>,
    state: RunType<State>,
) -> Result<RunType<State>, ListIssuesError> {
    match state {
        RunType::DryRun(state) if state.gitea_config.is_none() => {
            Err(ListIssuesError::NotConfigured)
        }
        RunType::DryRun(mut state) => {
            if let Some(labels) = labels {
                info!(
                    "Would query configured Gitea instance for issues with labels {}",
                    labels.join(", ")
                );
            } else {
                info!("Would query configured Gitea instance for issues with any labels");
            }

            info!("Would prompt user to select an issue");

            state.issue = state::Issue::Selected(Issue {
                key: String::from("123"),
                summary: String::from("Test issue"),
            });

            Ok(RunType::DryRun(state))
        }

        RunType::Real(state) => {
            let config = state.gitea_config;
            let (gitea, issues) = list_issues(config.as_ref(), state.gitea, labels)?;
            let issue = prompt::select(issues, "Select an Issue")?;
            info!("Selected item: {issue}");
            Ok(RunType::Real(State {
                gitea,
                gitea_config: config,
                issue: state::Issue::Selected(issue),
                ..state
            }))
        }
    }
}
