//
//  CLBaseTableController.swift

//
//  Created by Leon on 2025/7/20.
//

import UIKit
import SnapKit

class CLBaseTableController: CLBaseViewController, UITableViewDelegate, UITableViewDataSource {
    // MARK: - Properties
    var tableView: UITableView!
    var page: Int = 1
    var pageSize: Int = 10
    var datas: [Any] = []
    
    var listViewDidScrollCallback: ((UIScrollView) -> Void)?
    
    // MARK: - Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        initData()
        initUI()
    }
    
    // MARK: - Setup
    private func initData() {
        page = 1
        pageSize = 10
        datas = []
    }
    
    private func initUI() {
        tableView = UITableView(frame: .zero, style: .plain)
        tableView.separatorStyle = .none
        tableView.delegate = self
        tableView.dataSource = self
        tableView.estimatedRowHeight = 80
        
        tableView.sectionHeaderHeight = 0
        tableView.sectionFooterHeight = 0
        tableView.estimatedSectionHeaderHeight = 0
        tableView.estimatedSectionFooterHeight = 0
        
        tableView.backgroundColor = .clear
        tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: UIWindow.safeAreaBottom + 16, right: 0)
        tableView.contentInsetAdjustmentBehavior = .never
        if #available(iOS 15.0, *) {
            tableView.sectionHeaderTopPadding = 0
        }
        view.addSubview(tableView)
        tableView.snp.makeConstraints { make in
            make.leading.trailing.top.bottom.equalTo(view)
        }
    }
    
    // MARK: - Public Methods
    func addRefreshHeaderFooter() {
        addRefreshHeader()
        addRefreshFooter()
    }
    
    func addRefreshHeader() {
        RefreshHeaderAnimator { [weak self] in
            self?.loadNewData()
        }.link(to: tableView)
    }
    
    func addRefreshFooter() {
        RefreshFooterAnimator { [weak self] in
            self?.loadMoreData()
        }.link(to: tableView)
    }
    
    func removeRefreshHeader() {
        tableView.mj_header = nil
    }
    
    func removeRefreshFooter() {
        tableView.mj_footer = nil
    }
    
    func loadNewData() {
        page = 1
        loadData()
    }
    
    func loadMoreData() {
        page += 1
        loadData()
    }
    
    func loadData() {
        // To be implemented by subclasses
    }
    
    func scrollCurrentContentTop() {
        tableView.setContentOffset(.zero, animated: true)
    }
    
    // MARK: - UITableViewDataSource
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return datas.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell(style: .default, reuseIdentifier: "cell")
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        listViewDidScrollCallback?(scrollView)
    }
}
