CNUpSlideViewController.swift 15.3 KB
//
//  CNUpSlideViewController.swift
//  metaCode
//
//  Created by zx on 2023/10/13.
//  下滑页原生页-首页

import Foundation
import UIKit

//下滑tableview背景颜色
let kCNDownSlideBackgroundColorHex: String = "#F7F8FA"

///CNliveDownSlideModel Type
let SlideModelTypeRecommend4: String = "4"//4一排两个 推荐课程&推荐活动
let SlideModelTypeTodayRecommend74: String = "74"//74今日推荐
let SlideModelTypeAllCourse12: String = "12"//12列表全部课程
let SlideModelTypeOneCourse75: String = "75"//75单课程大图

class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITableViewDataSource{
    
    let kCNLiveDownSlideAllCourseCellIdentifier = "kCNLiveDownSlideAllCourseCellIdentifier"
    let kCNLiveDownSlideRecommendCellIdentifier = "kCNLiveDownSlideRecommendCellIdentifier"
    let kCNLiveDownSlideTodayRecommendCellIdentifier = "kCNLiveDownSlideTodayRecommendCellIdentifier"
    let kCNLiveDownSlideSingleCourseCellIdentifier = "kCNLiveDownSlideSingleCourseCellIdentifier"
    
    //我的课程cellID
    let kCNLiveDownSlideMyCurriculumCellIdentifier = "kCNLiveDownSlideMyCurriculumCellIdentifier"
    
    var totolNum = 0//一共显示多少行cell
    
    var selectedCell: CNDownSlideSingleCourseCell?
    
    var statusBarShouldBeHidden = false
    //we need to set `View controller-based status bar appearance = YES` in info.plist.
    //so we can be able to hide statusBar.
    override var prefersStatusBarHidden: Bool {
        return statusBarShouldBeHidden
    }
    
    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
        return .slide
    }
    //IDmodel
    var _idModel : StandListModel?
    var idModel : StandListModel? {
        get{
            _idModel
        }
        set{
            _idModel = newValue
        }
        
    }
    var _downPath:String?
    var downPath:String? {
        get{
            return _downPath
        }
        set{
            _downPath = newValue!
            self.getPageApi()
        }
    }
    
    // MARK: - 懒加载
    ///数据源
    lazy var dataArray: NSMutableArray = {
        var dataArray = NSMutableArray()
        return dataArray
    }()
    
    // 我的课程 index
    var myCurriculumIndex = -1
    //是否第一个展示'我的课程'
    var isFirstMyCurriculum = false
    ///我的课程数据源
    lazy var myCurriculumDataArray: NSMutableArray = {
        var myCurriculumDataArray = NSMutableArray()
        return myCurriculumDataArray
    }()
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.updateStatusBarAndTabbarFrame(visible: true)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex)
        view.addSubview(tableView)
        tableView.frame = CGRect(x: 0, y: KStatusBarHeight, width: KSreenWidth, height: KSreenHeight-DownSlideBottomViewHeight-KStatusBarHeight)
    }

    lazy var tableView : UITableView = {
        let tableView = UITableView(frame: .zero, style: .plain)
        tableView.dataSource = self
        tableView.delegate = self
        tableView.separatorStyle = .none
        tableView.bounces = false
        tableView.register(CNLiveDownSlideRecommendCell.self, forCellReuseIdentifier: kCNLiveDownSlideRecommendCellIdentifier)
        tableView.register(CNLiveDownSlideTodayRecommendCell.self, forCellReuseIdentifier: kCNLiveDownSlideTodayRecommendCellIdentifier)
        tableView.register(CNDownSlideSingleCourseCell.self, forCellReuseIdentifier: kCNLiveDownSlideAllCourseCellIdentifier)
        tableView.register(CNDownSlideSingleCourseCell.self, forCellReuseIdentifier:kCNLiveDownSlideSingleCourseCellIdentifier)
        tableView.backgroundColor = HexColor(kCNDownSlideBackgroundColorHex)
        return tableView
    }()
    
    private func updateStatusBarAndTabbarFrame(visible: Bool) {
        statusBarShouldBeHidden = !visible
        UIView.animate(withDuration: 0.25) {
            self.setNeedsStatusBarAppearanceUpdate()
        }
    }

    // MARK: - UITableViewDelegate
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        self.dataArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        if indexPath.row == self.myCurriculumIndex{
            //我的课程cell
            let myCurriculumModel = self.dataArray[indexPath.row] as! CNLiveAlbumBaseModel
            guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideAllCourseCellIdentifier) as? CNDownSlideSingleCourseCell
            else {
                let cell = CNDownSlideSingleCourseCell()
                return cell
            }
            cell.myCurriculum = myCurriculumModel
            return cell
        }else{
            
            let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
            
            //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图
            if slideModel.type == SlideModelTypeRecommend4{
                guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideRecommendCellIdentifier) as? CNLiveDownSlideRecommendCell
                else {
                    return CNLiveDownSlideRecommendCell()
                }
                cell.slideModel = slideModel
                return cell
            }else if slideModel.type == SlideModelTypeTodayRecommend74{
                guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideTodayRecommendCellIdentifier) as? CNLiveDownSlideTodayRecommendCell
                else {
                    let cell = CNLiveDownSlideTodayRecommendCell()
                    cell.slideModel = slideModel
                    return cell
                }
                cell.slideModel = slideModel
                return cell
            }else if slideModel.type == SlideModelTypeAllCourse12{
                guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideAllCourseCellIdentifier) as? CNDownSlideSingleCourseCell
                else {
                    let cell = CNDownSlideSingleCourseCell()
                    cell.slideModel = slideModel
                    return cell
                }
                cell.slideModel = slideModel
                return cell
            }else if slideModel.type == SlideModelTypeOneCourse75{
                guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDownSlideSingleCourseCellIdentifier) as? CNDownSlideSingleCourseCell
                else {
                    let cell = CNDownSlideSingleCourseCell()
                    return cell
                }
                cell.slideModel = slideModel
                return cell
            }else{
                return UITableViewCell()
            }
        }
    }
    
    
    func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) {
        guard let row = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
        UIView.animate(withDuration: 0.1) {
            row.bgBackView.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)
        }
    }
    
    func tableView(_ tableView: UITableView, didUnhighlightRowAt indexPath: IndexPath) {
        guard let row = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
        UIView.animate(withDuration: 0.3) {
            row.bgBackView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
        }
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        var cellType:CNLiveHomePageCellType = .course
        
        if indexPath.row == self.myCurriculumIndex{
            //我的课程cell
            let myCurriculumModel = self.dataArray[indexPath.row] as! CNLiveAlbumBaseModel
            cellType = .courseToMyCurriculum
            guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
            selectedCell = cell
            let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: nil, albumModel: myCurriculumModel, cellType: cellType), cellType: cellType)
            detailVC.dismissClosure = { [weak self] in
                guard let StrongSelf = self else { return }
                StrongSelf.updateStatusBarAndTabbarFrame(visible: true)
            }
            updateStatusBarAndTabbarFrame(visible: false)
            present(detailVC, animated: true, completion: nil)
        }else{
            let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
            ///model
            ///(1) 1,2时跳转:sharelUrl后面拼接 ?contentId=contentId&videoId=pid
            ///(2) 3,4时跳转:thirdUrl
            ///(3)“album”,“album_video”,“album_ugc” -> http://wjjh5.cnlive.com/cnYmAlbumVideoList.html?aid=contentId&title=titlle
            if slideModel.contents.first?.model ?? "0" == kCNDownSlideContentsModelModel1 || slideModel.contents.first?.model ?? "0" == kCNDownSlideContentsModelModel2 || slideModel.contents.first?.model ?? "0" == kCNDownSlideContentsModelModel3 || slideModel.contents.first?.model ?? "0" == kCNDownSlideContentsModelModel4{
                cellType = .course
            }else if slideModel.contents.first?.model ?? "0" == kCNDownSlideContentsModelModelAlbum_ugc{
                cellType = .playlet
            }else{
                //新类型
            }
            //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图
            if slideModel.type == SlideModelTypeAllCourse12{
                guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
                selectedCell = cell
                let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel, albumModel: nil, cellType: cellType), cellType: cellType)
                detailVC.dismissClosure = { [weak self] in
                    guard let StrongSelf = self else { return }
                    StrongSelf.updateStatusBarAndTabbarFrame(visible: true)
                }
                updateStatusBarAndTabbarFrame(visible: false)
                present(detailVC, animated: true, completion: nil)
            }else if slideModel.type == SlideModelTypeOneCourse75{
                guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
                selectedCell = cell
                
                let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel, albumModel: nil, cellType: cellType), cellType: cellType)
                
                detailVC.dismissClosure = { [weak self] in
                    guard let StrongSelf = self else { return }
                    StrongSelf.updateStatusBarAndTabbarFrame(visible: true)
                }
                updateStatusBarAndTabbarFrame(visible: false)
                present(detailVC, animated: true, completion: nil)
            }
        }
      
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.row == self.myCurriculumIndex{
            let myCurriculumModel = self.dataArray[indexPath.row] as! CNLiveAlbumBaseModel
            let contentsNum = myCurriculumModel.list.count
            //总显示块数/循环数
            let totalNum = (contentsNum >= 4) ? 4 : contentsNum
            let cellH = DownSlideAllCourseTitleH + DownSlideAllCourseRowH * CGFloat(totalNum)+DownSlideRecommendLeftGap
            return cellH
        }else{
            if self.dataArray[indexPath.row] is CNLiveDownSlideModel{
                let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
                return CGFloat(slideModel.cellH)
            }else{
                return 50
            }
        }
    }
    
    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 0
    }
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0
    }
    //MARK: - 网络请求获取详情页
    func getPageApi()
    {
//        showLoading(message: "")
        CNLiveDownSlideViewModel.requestGetPage(pageId: _downPath! as NSString) { result, status in
            hiddenLoading()
            
            if status == .success{
                
                self.dataArray.removeAllObjects()
                let array = result as! [Any]
                let newDataArray = NSMutableArray()
                for slideModel in array {
                    if let model = slideModel as? CNLiveDownSlideModel{
                        
                         let layout = CNLiveDownSlideModelLayout.init(model: model)
                        newDataArray.addObjects(from: [layout.getCellHModel()])
                    }
                }
                self.dataArray.addObjects(from: newDataArray as! [Any])
                if self.idModel?.id == 16{//后面改成6
                    //幼教中国,请求我的课程接口
                    self.getYjzgMyCurriculumApi()
                    let firMdl = self.dataArray.firstObject as! CNLiveDownSlideModel
                    if firMdl.type == SlideModelTypeTodayRecommend74{
                        self.isFirstMyCurriculum = false
                    }else{
                        self.isFirstMyCurriculum = true
                    }
                }else{
                    self.tableView.reloadData()
                }
                
            }else if (status == .failed){
//                self.NetApiStatus = .apiError
            }else if (status == .noNetwork){
                
//                self.NetApiStatus = .notNetwork
            }
        }
//
    }
    //MARK: - 幼教中国获取 我的课程
    func getYjzgMyCurriculumApi()
    {
//        showLoading(message: "")
        CNLiveDownSlideViewModel.getYjzgMyCurriculum(page: 1) { result, status in
            hiddenLoading()
            if status == .success{
                self.myCurriculumDataArray.removeAllObjects()
                let albumBaseModel = result as! CNLiveAlbumBaseModel
                self.myCurriculumDataArray.addObjects(from: [albumBaseModel])
                self.myCurriculumIndex = -1
                if self.myCurriculumDataArray.count>0{
                    //有我的课程
                    if self.isFirstMyCurriculum{
                        //第一个区块显示
                        self.myCurriculumIndex = 0
                    }else{
                        //第二个区块显示
                        self.myCurriculumIndex = 1
                    }
                }else{
                    //没有我的课程
                    self.myCurriculumIndex = -1
                }
                self.dataArray.insert(albumBaseModel, at: self.myCurriculumIndex)
                self.tableView.reloadData()
            }else if (status == .failed){
//                self.NetApiStatus = .apiError
            }else if (status == .noNetwork){
                
//                self.NetApiStatus = .notNetwork
            }
        }
    }
}