//
//  PermissionApplyModels.swift
//  suixinkan
//

import Foundation

/// 首页进入权限申请流程时的目标页面。
enum PermissionApplyDestination: Equatable {
    case apply
    case status(applyCode: String)
}

/// 权限申请页待确认删除的对象。
enum PermissionDeletionTarget: Equatable {
    case role(name: String)
    case scenic(id: Int, name: String)

    /// Android 删除弹窗标题。
    var dialogTitle: String {
        switch self {
        case .role: "是否删除该角色"
        case .scenic: "是否删除该景区"
        }
    }

    /// Android 删除弹窗正文。
    var dialogMessage: String {
        switch self {
        case .role(let name): "您确定要删除\(name)角色吗?"
        case .scenic(_, let name): "您确定要删除\(name)吗?"
        }
    }
}

/// 待审核的角色权限申请响应。
struct RoleApplyPendingResponse: Decodable, Equatable {
    let code: String
    let roleId: Int
    let roleName: String
    let scenicList: [RoleApplyScenicItem]
    let status: Int
    let statusLabel: String
    let createdAt: String
    let auditNote: String
    let auditedAt: String?
    let auditedBy: String?

    enum CodingKeys: String, CodingKey {
        case code
        case roleId = "role_id"
        case roleName = "role_name"
        case scenicList = "scenic_list"
        case status
        case statusLabel = "status_label"
        case createdAt = "created_at"
        case auditNote = "audit_note"
        case auditedAt = "audited_at"
        case auditedBy = "audited_by"
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        code = try container.decodeIfPresent(String.self, forKey: .code) ?? ""
        roleId = try container.decodeIfPresent(Int.self, forKey: .roleId) ?? 0
        roleName = try container.decodeIfPresent(String.self, forKey: .roleName) ?? ""
        scenicList = try container.decodeIfPresent([RoleApplyScenicItem].self, forKey: .scenicList) ?? []
        status = try container.decodeIfPresent(Int.self, forKey: .status) ?? 0
        statusLabel = try container.decodeIfPresent(String.self, forKey: .statusLabel) ?? ""
        createdAt = try container.decodeIfPresent(String.self, forKey: .createdAt) ?? ""
        auditNote = try container.decodeIfPresent(String.self, forKey: .auditNote) ?? ""
        auditedAt = try container.decodeIfPresent(String.self, forKey: .auditedAt)
        auditedBy = try container.decodeIfPresent(String.self, forKey: .auditedBy)
    }
}

/// 权限申请中的景区摘要。
struct RoleApplyScenicItem: Decodable, Equatable {
    let id: Int
    let name: String
}

/// 全部可申请景区响应。
struct ScenicListAllResponse: Decodable, Equatable {
    let total: Int
    let list: [ScenicListItem]

    init(total: Int = 0, list: [ScenicListItem] = []) {
        self.total = total
        self.list = list
    }
}

/// 可申请景区条目。
struct ScenicListItem: Decodable, Equatable {
    let id: Int
    let name: String
}

/// 权限申请提交参数。
struct RoleApplySubmitRequest: Encodable {
    let scenicId: [Int]
    let roleId: Int

    enum CodingKeys: String, CodingKey {
        case scenicId = "scenic_id"
        case roleId = "role_id"
    }
}

/// 权限申请角色选项。
struct RoleOption: Equatable, Hashable {
    let id: Int
    let name: String
    let description: String
    var isSelected: Bool
}

/// 权限申请景区选项。
struct ScenicOption: Equatable, Hashable {
    let id: Int
    let name: String
    var isSelected: Bool
    var isDisabled: Bool
}
