// ВНИМАНИЕ Сгенерировано автоматом из файла MeetupId.yml
// ВНИМАНИЕ Не менять руками!

import AELog
import BusX
import Combine
import CordX
import Foundation
import MPAKX
import UIKit

// MARK: - Context

public protocol MeetupIdContext {
  var join: Bool { get }
  var textApp: MPAK.Recent<String> { get }
  var textUI: MPAK.Recent<String> { get }
}

// MARK: - Controller

extension MeetupId {
  final class Controller: MPAK.Controller<MeetupId.Model> {
    init() {
      super.init(
        MeetupId.Model(),
        debugClassName: "MeetupICtrl",
        debugLog: { aelog($0) }
      )
    }
  }



  // MARK: - Model

  public struct Model: MeetupIdContext {
    public var join: Bool = false
    public var textApp: MPAK.Recent<String> = .init("")
    public var textUI: MPAK.Recent<String> = .init("")
  }

  // MARK: - Service

  public final class Service {
    let ctrl = Controller()
    let world: World

    var subscriptions = [AnyCancellable]()
    static private(set) weak var singleton: Service?

    public init(_ world: World) {
      self.world = world
      Self.singleton = self
      SectionGenerated.setupPlatform(ctrl, self, world)
    }
  }

  // MARK: - World

  public struct World {
    let join = PassthroughSubject<Void, Never>()
    let textApp = PassthroughSubject<String, Never>()
    let textUI = PassthroughSubject<String, Never>()

    public init(

    ) {

    }
  }

  enum SectionGenerated {



    // MARK: - SectionGenerated Service

    static func setupPlatform(
      _ ctrl: Controller,
      _ service: Service,
      _ world: World
    ) {
      // MARK: - SectionGenerated Service Actions

      ctrl.m
        .sink { v in Bus.send("MeetupId", v) }
        .store(in: &service.subscriptions)


      // MARK: - SectionGenerated Service Pipes

      ctrl.pipe(
        dbg: "join",
        sub: nil,
        Bus.events.compactMap { Bus.convertKeyValue(K.join, $0) }.map { (k: String, v: Void) in v }.eraseToAnyPublisher(),
        { $0.join = true },
        { $0.join = false }
      )






      ctrl.pipeValue(
        dbg: "textA",
        sub: nil,
        Bus.events.compactMap { Bus.convertKeyValue(K.textApp, $0) }.map { (k: String, v: String) in v }.eraseToAnyPublisher(),
        {
          $0.textApp.value = $1
          $0.textApp.isRecent = true
        },
        { m, _ in m.textApp.isRecent = false }
      )



      ctrl.pipeValue(
        dbg: "textUI",
        sub: nil,
        Bus.events.compactMap { Bus.convertKeyValue(K.textUI, $0) }.map { (k: String, v: String) in v }.eraseToAnyPublisher(),
        {
          $0.textUI.value = $1
          $0.textUI.isRecent = true
        },
        { m, _ in m.textUI.isRecent = false }
      )




    }

  }
}